R 通过创建新变量重塑形状

R 通过创建新变量重塑形状,r,R,如何通过向下面的数据集添加另一个名为month的变量来转换数据 ID Com Lac Nov(PM) Nov(TM) Dec(PM) Dec(TM) 1 A E 12 11 28 29 2 B F 2 13 26 44 3 C G 7 15 18 37 4 D

如何通过向下面的数据集添加另一个名为month的变量来转换数据

ID   Com    Lac   Nov(PM)    Nov(TM)  Dec(PM) Dec(TM)
1     A      E      12        11        28       29
2     B      F      2         13        26       44
3     C      G      7         15        18       37
4     D      H      4         10        22       22
上面是需要进行如下转换的数据帧

ID   Com    Lac   Month    PM     TM
1    A       E     Nov      12    11
1    A       E     Dec      28    29
2    B       F     Nov      2     13
2    B       F     Dec      26    44
3    C       G     Nov      7     15
3    C       G     Dec      18    37
4    D       H     Nov      4     10
4    D       H     Dec      22    22
数据:


df1这里有一个带有
tidyverse
的选项。我们
以“长”格式收集列“11月(PM)
到“12月(TM)
”,然后使用
提取
,将“关键”列拆分为“月”和另一列,最后
将其扩展为“宽”格式

df1 %>%
   gather(key, val, `Nov(PM)`:`Dec(TM)`) %>% 
   extract(key, into = c('Month', 'key'), '^([^)]+)\\(([^)]+).*') %>% 
   spread(key, val)
#  ID Com Lac Month PM TM
#1  1   A   E   Dec 28 29
#2  1   A   E   Nov 12 11
#3  2   B   F   Dec 26 44
#4  2   B   F   Nov  2 13
#5  3   C   G   Dec 18 37
#6  3   C   G   Nov  7 15
#7  4   D   H   Dec 22 22
#8  4   D   H   Nov  4 10
数据
df1所有函数中最邪恶、最被轻视的函数,
restrape
处理得非常好。只要您将名称从
“时间(变量)”
旋转到
“变量时间”
,它将一次性处理所有内容:

names(df1) <- gsub("(.+?)\\((.+?)\\)", "\\2_\\1", names(df1))
reshape(df1, idvar=c("ID","Com","Lac"), varying=4:7,
        direction="long", sep="_", timevar="Month")

#          ID Com Lac Month PM TM
#1.A.E.Nov  1   A   E   Nov 12 11
#2.B.F.Nov  2   B   F   Nov  2 13
#3.C.G.Nov  3   C   G   Nov  7 15
#4.D.H.Nov  4   D   H   Nov  4 10
#1.A.E.Dec  1   A   E   Dec 28 29
#2.B.F.Dec  2   B   F   Dec 26 44
#3.C.G.Dec  3   C   G   Dec 18 37
#4.D.H.Dec  4   D   H   Dec 22 22

names(df1)能否使用dput()提供一个可重复的示例@akrun-我承认这有点棘手,但它也非常灵活!它在R用户中没有很多粉丝,所以我喜欢开玩笑地向它糟糕的声誉致敬。
df1 <- structure(list(ID = 1:4, Com = c("A", "B", "C", "D"), Lac = c("E", 
 "F", "G", "H"), `Nov(PM)` = c(12L, 2L, 7L, 4L), `Nov(TM)` = c(11L, 
13L, 15L, 10L), `Dec(PM)` = c(28L, 26L, 18L, 22L), `Dec(TM)` = c(29L, 
44L, 37L, 22L)), class = "data.frame", row.names = c(NA, -4L))
names(df1) <- gsub("(.+?)\\((.+?)\\)", "\\2_\\1", names(df1))
reshape(df1, idvar=c("ID","Com","Lac"), varying=4:7,
        direction="long", sep="_", timevar="Month")

#          ID Com Lac Month PM TM
#1.A.E.Nov  1   A   E   Nov 12 11
#2.B.F.Nov  2   B   F   Nov  2 13
#3.C.G.Nov  3   C   G   Nov  7 15
#4.D.H.Nov  4   D   H   Nov  4 10
#1.A.E.Dec  1   A   E   Dec 28 29
#2.B.F.Dec  2   B   F   Dec 26 44
#3.C.G.Dec  3   C   G   Dec 18 37
#4.D.H.Dec  4   D   H   Dec 22 22