如何通过向下面的数据集添加另一个名为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))
这是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
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))
所有功能中最邪恶和最鄙视的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