在“reshape2简介”包中,SeanC.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发布于 2015-07-06 05:56:57
另一个选择是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函数。安装开发版本的说明是here。
library(data.table)#v1.9.5+
setDT(aql)[, indx:=1:.N, variable]
dcast(aql, indx~variable, value.var='value')[,-1]发布于 2015-07-06 05:39:23
使用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 6https://stackoverflow.com/questions/31238013
复制相似问题