没有ID变量的dcast

con*_*ion 3 r reshape2 data.table

在"reshape2简介"包中,Sean C. Anderson提供了以下示例.

他使用空气质量数据并重命名列名称

names(airquality) <- tolower(names(airquality))
Run Code Online (Sandbox Code Playgroud)

数据看起来像

#   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
Run Code Online (Sandbox Code Playgroud)

然后他融化了他们

aql <- melt(airquality, id.vars = c("month", "day"))
Run Code Online (Sandbox Code Playgroud)

要得到

#   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
Run Code Online (Sandbox Code Playgroud)

最后他获得了原始的(不同的列顺序)

aqw <- dcast(aql, month + day ~ variable)
Run Code Online (Sandbox Code Playgroud)

我的问题

现在假设我们没有ID变量(即月和日)并且已经如下熔化数据

aql <- melt(airquality)
Run Code Online (Sandbox Code Playgroud)

看起来像

#   variable value
# 1    ozone    41
# 2    ozone    36
# 3    ozone    12
# 4    ozone    18
# 5    ozone    NA
# 6    ozone    28
Run Code Online (Sandbox Code Playgroud)

我的问题是如何获得原始的?原始的对应于

#   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
Run Code Online (Sandbox Code Playgroud)

akr*_*run 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
Run Code Online (Sandbox Code Playgroud)

问题是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
Run Code Online (Sandbox Code Playgroud)

如果你正在使用data.table,开发data.tableie的版本.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]
Run Code Online (Sandbox Code Playgroud)