通过创建新变量来重塑

问题描述 投票:-1回答:2

如何通过向下面的数据集添加另一个名为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 <- 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))
r
2个回答
3
投票

这是tidyverse的一个选项。我们gather将列'Nov(PM)to 'Dec(TM)改为'long'格式,然后使用extract,将'key'列拆分为'Month'和另一列,最后将spread拆分为'wide'格式

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

data

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))

1
投票

所有功能中最邪恶和最鄙视的reshape处理得非常好。只要你将名字从"Time(Variable)"旋转到"Variable_Time",它就会一次性处理它:

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
© www.soinside.com 2019 - 2024. All rights reserved.