没有 ID 变量的 dcast
dcast without ID variables
在 "An Introduction to reshape2" 包中,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
一个选项使用 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
另一种选择是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
的开发版本。 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]
在 "An Introduction to reshape2" 包中,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
一个选项使用 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
另一种选择是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
的开发版本。 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]