reshape2 和宽(推算)时间变量
reshape2 and wide (imputed) time variables
我知道 base R 的 reshape
可以转换为长格式,其中时间是根据存根变量名称 A
和 B
估算的,例如:
wide = data.frame(A.2010 = c('a', 'b', 'c'),
A.2011 = c('f', 'g', 'd'),
B.2010 = c('A', 'B', 'C'),
B.2011 = c('G', 'G', 'H'),
z = runif(3),
x = runif(3))
wide
# A.2010 A.2011 B.2010 B.2011 z x
#1 a f A G 0.3626823 0.67212468
#2 b g B G 0.3726911 0.09663248
#3 c d C H 0.9807237 0.31259394
变成:
reshape(wide, direction = 'long', sep = '.',
varying = c('A.2010', 'A.2011', 'B.2010', 'B.2011'))
# z x time A B id
#1.2010 0.3626823 0.67212468 2010 a A 1
#2.2010 0.3726911 0.09663248 2010 b B 2
#3.2010 0.9807237 0.31259394 2010 c C 3
#1.2011 0.3626823 0.67212468 2011 f G 1
#2.2011 0.3726911 0.09663248 2011 g G 2
#3.2011 0.9807237 0.31259394 2011 d H 3
我可以用 reshape2::melt
完成同样的事情吗?
似乎 base r 中的 reshape
是执行此操作的最佳工具,因为 reshape2
包中的 melt
函数中没有类似的功能。但是,您可以使用 melt.data.table
:
中的 patterns
函数实现类似的功能
library(reshape2)
library(data.table)
wide = data.table(wide)
long = melt(wide, id.vars = c("z", "x"), measure = patterns("^A", "^B"),
value.name = c("A", "B"), variable.name = "time")
> long
z x time A B
1: 0.3421681 0.8432707 1 a A
2: 0.1243282 0.5096108 1 b B
3: 0.3650165 0.1441660 1 c C
4: 0.3421681 0.8432707 2 f G
5: 0.1243282 0.5096108 2 g G
6: 0.3650165 0.1441660 2 d H
请注意,melt
识别出不同的 "time",并将它们正确分组,但没有按需要使用 2010 和 2011。解决方法是手动重新编码级别,这应该是微不足道的。
levels(long$time) = c("2010", "2011")
> long
z x time A B
1: 0.3421681 0.8432707 2010 a A
2: 0.1243282 0.5096108 2010 b B
3: 0.3650165 0.1441660 2010 c C
4: 0.3421681 0.8432707 2011 f G
5: 0.1243282 0.5096108 2011 g G
6: 0.3650165 0.1441660 2011 d H
希望对您有所帮助!
我知道 base R 的 reshape
可以转换为长格式,其中时间是根据存根变量名称 A
和 B
估算的,例如:
wide = data.frame(A.2010 = c('a', 'b', 'c'),
A.2011 = c('f', 'g', 'd'),
B.2010 = c('A', 'B', 'C'),
B.2011 = c('G', 'G', 'H'),
z = runif(3),
x = runif(3))
wide
# A.2010 A.2011 B.2010 B.2011 z x
#1 a f A G 0.3626823 0.67212468
#2 b g B G 0.3726911 0.09663248
#3 c d C H 0.9807237 0.31259394
变成:
reshape(wide, direction = 'long', sep = '.',
varying = c('A.2010', 'A.2011', 'B.2010', 'B.2011'))
# z x time A B id
#1.2010 0.3626823 0.67212468 2010 a A 1
#2.2010 0.3726911 0.09663248 2010 b B 2
#3.2010 0.9807237 0.31259394 2010 c C 3
#1.2011 0.3626823 0.67212468 2011 f G 1
#2.2011 0.3726911 0.09663248 2011 g G 2
#3.2011 0.9807237 0.31259394 2011 d H 3
我可以用 reshape2::melt
完成同样的事情吗?
似乎 base r 中的 reshape
是执行此操作的最佳工具,因为 reshape2
包中的 melt
函数中没有类似的功能。但是,您可以使用 melt.data.table
:
patterns
函数实现类似的功能
library(reshape2)
library(data.table)
wide = data.table(wide)
long = melt(wide, id.vars = c("z", "x"), measure = patterns("^A", "^B"),
value.name = c("A", "B"), variable.name = "time")
> long
z x time A B
1: 0.3421681 0.8432707 1 a A
2: 0.1243282 0.5096108 1 b B
3: 0.3650165 0.1441660 1 c C
4: 0.3421681 0.8432707 2 f G
5: 0.1243282 0.5096108 2 g G
6: 0.3650165 0.1441660 2 d H
请注意,melt
识别出不同的 "time",并将它们正确分组,但没有按需要使用 2010 和 2011。解决方法是手动重新编码级别,这应该是微不足道的。
levels(long$time) = c("2010", "2011")
> long
z x time A B
1: 0.3421681 0.8432707 2010 a A
2: 0.1243282 0.5096108 2010 b B
3: 0.3650165 0.1441660 2010 c C
4: 0.3421681 0.8432707 2011 f G
5: 0.1243282 0.5096108 2011 g G
6: 0.3650165 0.1441660 2011 d H
希望对您有所帮助!