【问题标题】:R data.table: New data table with named columns and drop the restR data.table:带有命名列的新数据表并删除其余部分
【发布时间】:2021-04-21 11:34:16
【问题描述】:

我想做一些非常简单的事情,但到目前为止我还没有在一个命令中做到这一点。我想通过将函数应用于现有列的某些列来创建一个新的数据表,同时给它们一个名称并丢弃其余的列。 让我们看一个最小的例子:

library(data.table)
dt = data.table(A = c('a', 'a', 'a', 'b', 'b'),
                B = c(1  , 2  , 3  , 4  , 5  ),
                C = c(10 , 20 , 30 , 40 , 50))
dt
A   B   C
a   1   10
a   2   20
a   3   30
b   4   40
b   5   50

对于单列,我们可以这样做:

dt1 = dt[, .(totalB = sum(B)), by=A]
dt1
A   totalB
a   6
b   9

对于超过 1 列,我们可以这样做:

dt2 = dt[, .(totalB = sum(B), totalC = sum(C)), by=A]
dt2
A   totalB   totalC
a   6        60
b   9        90

但如果列很多,那不是最佳做法。所以我想我们应该像这样使用lapply

dt3 = dt[, lapply(.SD, sum), by = A]
dt3
A   B   C
a   6   60
b   9   90

创建表但没有名称。所以我们可以添加它们:

names = c("totalA", "totalB")
dt4 = dt[, c("totalA", "totalB") := lapply(.SD, sum), by = A ]
dt4
A   B   C   totalA  totalB
a   1   10  6   60
a   2   20  6   60
a   3   30  6   60
b   4   40  9   90
b   5   50  9   90

但现在这些列仍然存在。我们如何防止这种情况发生?另请注意,在我的实际问题中,我通过 SDcols 使用了列的子集,为简单起见,我没有在此处包括在内。

编辑:我想要的输出与dt2 相同,但我不想写下所有列。

【问题讨论】:

  • 为什么不直接在您的 dt4 创建中选择相关列,您可以添加一个额外的[] 并选择您感兴趣的两列。
  • @hannes101 不过,我实际上对很多专栏都感兴趣。所以没那么简单。另外,直觉上,应该有一种方法可以做我想做的事情,因为它是如此接近。

标签: r data.table


【解决方案1】:

你的意思是像下面这样的吗?

dt[, setNames(lapply(.SD, sum), paste0("total", names(.SD))), A]
  • 输出
   A totalB totalC
1: a      6     60
2: b      9     90

【讨论】:

  • 对不起,没有。我认为这实际上与我的dt4 相同。另外,我不会使用 totalB 等,所以我肯定想要名称向量。
  • @cgss 你想要的输出是什么?请举个例子
  • 我想要的输出与 dt2 相同,但如果我有 10 列写 `.(name1 = sum(col1), ... , name10=sum(col10)) 看起来有点糟糕。我将编辑问题以添加此内容。
  • 您的更新适用于 thw mwe。它也适用于我的 names 变量,而不是 paste 函数。奇怪的是,它在我的实际项目中导致以下错误:setnames(lapply(.SD, sum), names): x is not a data.table or data.frame 显然,它是一个数据框。
【解决方案2】:

另一个选项是setnames。创建一个列名向量,我们要应用除分组变量 ('nm1') 以外的函数,按 'A' 分组,获取 sum,并使用 setnames 并指定 oldnew

nm1 <- setdiff(names(dt), "A")
setnames(dt[, lapply(.SD, sum), A], nm1, paste0('total', nm1))[]

【讨论】:

    猜你喜欢
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    相关资源
    最近更新 更多