我有一个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参数经过内部优化,可在熔化过程中直接go 除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相关问答推荐

如何使用shinyChatR包配置聊天机器人

在R中替换函数中的特定符号

R Sapply函数产生的值似乎与for循环方法略有不同

错误:非常长的R行中出现意外符号

使用带有OR条件的grepl过滤字符串

无法定义沿边轨迹的 colored颜色 渐变(与值无关)

计算数据帧中指定值之前的行数,仅基于每行之后的future 行,单位为r

安全地测试文件是否通过R打开

汇总数据帧中的复制列,保持行的唯一性

WRS2包中带有bwtrim的简单ANOVA抛出错误

将数据集旋转到长格式,用于遵循特定名称模式的所有变量对

R -基线图-图形周围的阴影区域

为什么函数toTitleCase不能处理english(1),而toupper可以?

无法将条件case_when()应用于使用!!创建的新变量Mutations

数值型数据与字符混合时如何进行绑定

防止正则表达式覆盖以前的语句

R-使用stri_trans_General()将其音译为德语字母

从多行中 Select 最小值

用LOOCV进行K近邻问题

获取列位置