【问题标题】:dcast without ID variables没有 ID 变量的 dcast
【发布时间】:2015-07-06 04:56:00
【问题描述】:

在“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

【问题讨论】:

  • 您不应该在原始问题中编辑“解决方案”。如果您有不同/更好的解决方案,您应该在下面添加您的答案。否则,就接受你认为最好的那个。
  • 如果您使用的是 data.table,其重塑工具的教程在这里:rawgit.com/wiki/Rdatatable/data.table/vignettes/… 您的问题除了标签之外没有提到 data.table...

标签: r data.table reshape2


【解决方案1】:

另一个选项是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 功能。安装devel版本的说明是here

 library(data.table)#v1.9.5+
 setDT(aql)[, indx:=1:.N, variable]
 dcast(aql, indx~variable, value.var='value')[,-1]

【讨论】:

  • 谢谢!!我想在 data.table 对象中使用它(请参阅更新)
  • @conighion 使用 data.table 选项更新了帖子。确保安装开发版。
【解决方案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

【讨论】:

    猜你喜欢
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2020-12-29
    • 2011-03-17
    • 2015-02-18
    • 2014-06-26
    相关资源
    最近更新 更多