我有一个data table英寸的R:

library(data.table)
set.seed(1234)
DT <- data.table(x=rep(c(1,2,3),each=4), y=c("A","B"), v=sample(1:100,12))
DT
      x y  v
 [1,] 1 A 12
 [2,] 1 B 62
 [3,] 1 A 60
 [4,] 1 B 61
 [5,] 2 A 83
 [6,] 2 B 97
 [7,] 2 A  1
 [8,] 2 B 22
 [9,] 3 A 99
[10,] 3 B 47
[11,] 3 A 63
[12,] 3 B 49

我可以很容易地通过数据中的组对变量v求和.表:

out <- DT[,list(SUM=sum(v)),by=list(x,y)]
out
     x  y SUM
[1,] 1 A  72
[2,] 1 B 123
[3,] 2 A  84
[4,] 2 B 119
[5,] 3 A 162
[6,] 3 B  96

但是,我希望将组(y)作为列,而不是行.我可以使用reshape:

out <- reshape(out,direction='wide',idvar='x', timevar='y')
out
     x SUM.A SUM.B
[1,] 1    72   123
[2,] 2    84   119
[3,] 3   162    96

在聚合数据之后,有没有更有效的方法来reshape 数据?有没有办法使用数据将这些操作组合成一个步骤.手术台?

推荐答案

data.table包实现了更快的melt/dcast个函数(在C中).它还具有其他功能,允许熔化和铸造multiple columns.请在Github上查看新的Efficient reshaping using data.tables.

数据的melt/dcast函数.表从v1开始提供.9.0,其功能包括:

  • 铸造前无需装入reshape2个包装.但如果你想在其他操作中加载它,请加载before加载data.table.

  • dcast也是S3的通用版本.再也没有dcast.data.table()了.用dcast()就行了.

  • melt:

    • 能够在"列表"类型的列上熔化.

    • 增益variable.factorvalue.factor,默认情况下,与reshape2兼容的增益分别为TRUEFALSE.这允许直接控制variable列和value列的输出类型(是否为因子).

    • melt.data.tablena.rm = TRUE参数经过内部优化,可在熔化过程中直接去除NAs,因此效率更高.

    • 新增:melt可以接受measure.vars的列表,列表中每个元素指定的列将组合在一起.通过使用patterns()进一步简化了这一点.参见vignette或?melt.

  • dcast:

    • 接受多个fun.aggregate和多个value.var.参见vignette或?dcast.

    • 直接在公式中使用rowid()函数生成id列,有时需要该列来唯一标识行.看见dcast.

  • 旧基准:

    • melt:melt0万行5列,61.3秒缩短为1.2秒.
    • dcast:dcast万行4列,192秒缩短为3.6秒.

科隆提醒(2013年12月)演示幻灯片32:Why not submit a dcast pull request to reshape2?

R相关问答推荐

如何用来自lower.tri的匹配整数填充矩阵的upper.tri?

在向量中的下一个较高值之前查找值的数量

如果行值高于某个阈值,则返回列标题

在彩色和灰度下工作的调色板?

使用 mutate_at 和 contains 将函数应用于多列

空格后删除

从基本 R 图转换为 ggplot

改进 if else 语句

列出到 knitr 环境(在 R 块中使用 list2env 时出现 R-markdown 错误)

使用 Tidyverse 将数据从一列转换为多列

如何根据列表名称对数据进行排序?

R过滤多次出现但不包含特定字符串的数据

R pivot_longer 带有存根名称和最后一个下划线

如何将变量值映射到图案填充 - ggplot / ggpattern (

将字符向量中元素的唯一组合连接到 R 中的新字符串向量中

使用 for 循环遍历方程中的两个不同的值序列

purrr::map 会改变对象类型吗?

R组回程数据列

如何计算r中分布的重叠百分比?

无论向量中的关系如何,如何识别每个整数序列