首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >没有ID变量的dcast

没有ID变量的dcast
EN

Stack Overflow用户
提问于 2015-07-06 04:56:00
回答 2查看 1.7K关注 0票数 5

在“reshape2简介”包中,SeanC.Anderson给出了以下示例。

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

代码语言:javascript
运行
复制
names(airquality) <- tolower(names(airquality))

数据看上去像

代码语言:javascript
运行
复制
#   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

然后他把它们融化了

代码语言:javascript
运行
复制
aql <- melt(airquality, id.vars = c("month", "day"))

要获得

代码语言:javascript
运行
复制
#   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

最后,他得到了原来的(不同的列顺序)

代码语言:javascript
运行
复制
aqw <- dcast(aql, month + day ~ variable)

我的问题

现在假设我们没有ID变量(即月和日),并按以下方式融化了数据

代码语言:javascript
运行
复制
aql <- melt(airquality)

看上去像

代码语言:javascript
运行
复制
#   variable value
# 1    ozone    41
# 2    ozone    36
# 3    ozone    12
# 4    ozone    18
# 5    ozone    NA
# 6    ozone    28

我的问题是我怎样才能得到原始的?原来的应该是

代码语言:javascript
运行
复制
#   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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-06 05:56:57

另一个选择是unstack

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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.tabledata.table ie的开发版本。v1.9.5还具有dcast函数。安装开发版本的说明是here

代码语言:javascript
运行
复制
 library(data.table)#v1.9.5+
 setDT(aql)[, indx:=1:.N, variable]
 dcast(aql, indx~variable, value.var='value')[,-1]
票数 7
EN

Stack Overflow用户

发布于 2015-07-06 05:39:23

使用split的一种选择,

代码语言:javascript
运行
复制
out <- data.frame(sapply(split(aql, aql$variable), `[[`, 2))

在这里,数据被variable列分割,然后每个组的第二列被组合回一个数据框架(带有参数2[[函数传递给sapply)。

代码语言:javascript
运行
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31238013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档