在"重塑2"包Sean C. Anderson提供了以下示例。
他使用空气质量数据并重命名列名
names(airquality) <- tolower(names(airquality))
数据看起来像
# ozone solar.r wind temp month day
# 1 41 190 7.4 67 5 1
# 2 36 118 8.0 72 5 2
# 3 12 149 12.6 74 5 3
# 4 18 313 11.5 62 5 4
# 5 NA NA 14.3 56 5 5
# 6 28 NA 14.9 66 5 6
然后他把它们融化了
aql <- melt(airquality, id.vars = c("month", "day"))
获取
# month day variable value
# 1 5 1 ozone 41
# 2 5 2 ozone 36
# 3 5 3 ozone 12
# 4 5 4 ozone 18
# 5 5 5 ozone NA
# 6 5 6 ozone 28
最后,他通过
获得原始的(不同的列顺序)aqw <- dcast(aql, month + day ~ variable)
现在假设我们没有ID变量(即月份和日期),并将数据融化如下
aql <- melt(airquality)
看起来像
# variable value
# 1 ozone 41
# 2 ozone 36
# 3 ozone 12
# 4 ozone 18
# 5 ozone NA
# 6 ozone 28
我的问题是如何才能获得原始版本?原始的对应于
# ozone solar.r wind temp
# 1 41 190 7.4 67
# 2 36 118 8.0 72
# 3 12 149 12.6 74
# 4 18 313 11.5 62
# 5 NA NA 14.3 56
# 6 28 NA 14.9 66
答案 0 :(得分:6)
另一个选项是unstack
out <- unstack(aql,value~variable)
head(out)
# ozone solar.r wind temp month day
#1 41 190 7.4 67 5 1
#2 36 118 8.0 72 5 2
#3 12 149 12.6 74 5 3
#4 18 313 11.5 62 5 4
#5 NA NA 14.3 56 5 5
#6 28 NA 14.9 66 5 6
由于问题是dcast
,我们可以创建一个序列列,然后使用dcast
aql$indx <- with(aql, ave(seq_along(variable), variable, FUN=seq_along))
out1 <- dcast(aql, indx~variable, value.var='value')[,-1]
head(out1)
# ozone solar.r wind temp month day
#1 41 190 7.4 67 5 1
#2 36 118 8.0 72 5 2
#3 12 149 12.6 74 5 3
#4 18 313 11.5 62 5 4
#5 NA NA 14.3 56 5 5
#6 28 NA 14.9 66 5 6
如果您使用data.table
,则data.table
的开发版即ie。 v1.9.5
还具有dcast
功能。安装devel版本的说明是here
library(data.table)#v1.9.5+
setDT(aql)[, indx:=1:.N, variable]
dcast(aql, indx~variable, value.var='value')[,-1]
答案 1 :(得分:2)
使用split
,
out <- data.frame(sapply(split(aql, aql$variable), `[[`, 2))
此处,数据按variable
列拆分,然后每组的第二列合并回数据框([[
函数传递参数2
到sapply
)
head(out)
# Ozone Solar.R Wind Temp Month Day
# 1 41 190 7.4 67 5 1
# 2 36 118 8.0 72 5 2
# 3 12 149 12.6 74 5 3
# 4 18 313 11.5 62 5 4
# 5 NA NA 14.3 56 5 5
# 6 28 NA 14.9 66 5 6