Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将多个列重塑为具有不同时间的2个时间变量?_R_Dataframe_Reshape - Fatal编程技术网

R 将多个列重塑为具有不同时间的2个时间变量?

R 将多个列重塑为具有不同时间的2个时间变量?,r,dataframe,reshape,R,Dataframe,Reshape,我有以下数据帧: date clinic MALE_0_1 MALE_1_2 MALE_2_3 ... MALE_94_95 MALE_95+ FEMALE_0_1 FEMALE_1_2 ... FEMALE_95+ 2017-01-01 A 30 25 40 ... 70 90 28 22 ..

我有以下数据帧:

date         clinic   MALE_0_1   MALE_1_2   MALE_2_3   ...   MALE_94_95   MALE_95+   FEMALE_0_1   FEMALE_1_2   ...   FEMALE_95+
2017-01-01     A         30         25         40      ...       70          90          28            22      ...       40
2017-01-01     B         21         15         30      ...       45          27          31            40      ...       55
2017-02-01     C         29         35         45      ...       34          25          33            38      ...       45
我如何创建这样一个:

date        clinic    GENDER      AGE    NUMBER_PATIENTS
2017-01-01     A      MALE       0          30
2017-01-01     A      FEMALE     0          28
2017-01-01     A      MALE       1          25
2017-01-01     A      FEMALE     1          22
                   ....
2017-01-01     A      MALE       95+        90
2017-01-01     A      FEMALE     95+        40
2017-01-01     B      MALE       0          21
2017-01-01     B      FEMALE     0          31
                   ....
2017-02-01     C      MALE       0          29
2017-02-01     C      FEMALE     0          33
MALE_0_1
相当于年龄=0,
MALE_1_2
相当于年龄=1,等等

下面的代码-我应该如何在<代码>时报<代码>中包括女性、男性的“性别”和0:95的“年龄”

df <- reshape(df, 
              direction = "long",
              varying = list(names(df)[3:194]),
              v.names = "NUMBER_OF_PATIENTS",
              idvar = c("date", "clinic"),
              timevar = c("GENDER", "AGE"),
              times = ???)

df尝试这种接近您想要的方法:

library(tidyverse)
#Code
newdf <- df %>% 
  mutate(across(-date,~as.character(.))) %>%
  pivot_longer(-c(date,clinic)) %>%
  separate(name,c('Gender','V1','V2'),sep='_') %>%
  mutate(value=as.numeric(value))
库(tidyverse)
#代码
新DF%
变异(跨越(-date,~as.字符())%>%
pivot_更长(-c(日期,诊所))%>%
单独的(名称,c(‘性别’,‘V1’,‘V2’),sep='''''''>%
变异(值=作为数值(值))
输出:

# A tibble: 24 x 6
   date       clinic Gender V1    V2    value
   <date>     <chr>  <chr>  <chr> <chr> <dbl>
 1 2017-01-01 A      MALE   0     1        30
 2 2017-01-01 A      MALE   1     2        25
 3 2017-01-01 A      MALE   2     3        40
 4 2017-01-01 A      MALE   94    95       70
 5 2017-01-01 A      MALE   95.   NA       90
 6 2017-01-01 A      FEMALE 0     1        28
 7 2017-01-01 A      FEMALE 1     2        22
 8 2017-01-01 A      FEMALE 95.   NA       40
 9 2017-01-01 B      MALE   0     1        21
10 2017-01-01 B      MALE   1     2        15
# ... with 14 more rows
#一个tible:24 x 6
日期诊所性别V1 V2值
1 2017-01-01 A男性0 1 30
2 2017-01-01 A男1 2 25
3 2017-01-01 A男2 3 40
4 2017-01-01 A男94 95 70
5 2017-01-01 A男性95岁。NA 90
6 2017-01-01 A女0 1 28
7 2017-01-01 A女1 2 22
8 2017-01-01 A女性95岁。NA 40
9 2017-01-01 B男0 1 21
10 2017-01-01 B男1 2 15
# ... 还有14行

您可以在
pivot\u中指定要提取的模式

tidyr::pivot_longer(df, cols = -c(date, clinic), 
                    names_to = c('GENDER', 'AGE'), 
                    names_pattern = '(.*?)_(\\d+\\+?)', 
                    values_to = 'NUMBER_PATIENTS')

#    date       clinic GENDER AGE   NUMBER_PATIENTS
#   <chr>      <chr>  <chr>  <chr>           <int>
# 1 2017-01-01 A      MALE   0                  30
# 2 2017-01-01 A      MALE   1                  25
# 3 2017-01-01 A      MALE   2                  40
# 4 2017-01-01 A      MALE   94                 70
# 5 2017-01-01 A      MALE   95+                90
# 6 2017-01-01 A      FEMALE 0                  28
# 7 2017-01-01 A      FEMALE 1                  22
# 8 2017-01-01 A      FEMALE 95+                40
# 9 2017-01-01 B      MALE   0                  21
#10 2017-01-01 B      MALE   1                  15
# … with 14 more rows

这是完美的作品-非常感谢!非常感谢您的建议,我似乎没有“跨越”功能,因此它不适合我运行。@DanielaRodrigues嗨,Dani。尝试加载上次版本的
dplyr
,然后加载
tidyverse
。否则它会很麻烦,因为您的数据类型是数字和字符!
df <- structure(list(date = c("2017-01-01", "2017-01-01", "2017-02-01"
), clinic = c("A", "B", "C"), MALE_0_1 = c(30L, 21L, 29L), MALE_1_2 = c(25L, 
15L, 35L), MALE_2_3 = c(40L, 30L, 45L), MALE_94_95 = c(70L, 45L, 
34L), `MALE_95+` = c(90L, 27L, 25L), FEMALE_0_1 = c(28L, 31L, 
33L), FEMALE_1_2 = c(22L, 40L, 38L), `FEMALE_95+` = c(40L, 55L, 
45L)), class = "data.frame", row.names = c(NA, -3L))