【问题标题】:Renaming multiple columns in R data.table重命名 R data.table 中的多个列
【发布时间】:2017-08-09 16:57:45
【问题描述】:

这与 Henrik 提出的这个问题有关 Assign multiple columns using := in data.table, by group

但是,如果我想创建一个具有给定列名的新 data.table,而不是分配新列给现有列,该怎么办?

f <- function(x){list(head(x,2),tail(x,2))}
dt <- data.table(group=sample(c('a','b'),10,replace = TRUE),val=1:10)

> dt
    group val
 1:     b   1
 2:     b   2
 3:     a   3
 4:     b   4
 5:     a   5
 6:     b   6
 7:     a   7
 8:     a   8
 9:     b   9
10:     b  10

我想通过调用函数f来获得一个带有预定义列名的新data.table:

dt[,c('head','tail')=f(val),by=group]

希望得到这个:

   group head tail
1:     a    1    8
2:     a    3   10
3:     b    2    6
4:     b    5    9

但它给了我一个错误。我可以做的是创建表然后更改列名,但这似乎很麻烦:

> dt2 <- dt[,f(val),by=group]

> dt2
   group V1 V2
1:     a  1  8
2:     a  3 10
3:     b  2  6
4:     b  5  9

> colnames(dt2)[-1] <- c('head','tail')

> dt2
   group head tail
1:     a    1    8
2:     a    3   10
3:     b    2    6
4:     b    5    9

我一个电话就可以做到吗?

【问题讨论】:

  • 你为什么不直接用其中的名字定义ff &lt;- function(x){list(head = head(x,2), tail = tail(x,2))}?或者,我猜dt[, setNames(f(val), c("head", "tail")), group] 应该可以工作。
  • @A5C1D2H2I1M1N2O1R2T1 第二种方式的缺点是 data.table 抱怨(尽管只是安静地,当verbose = TRUE 时)。我想真正的问题是,当以编程方式使用 data.table 时(至少以 OP 想要的一般方式),最好构造表达式或完整的 [.data.table 调用来评估......
  • @A5C1D2H2I1M1N2O1R2T1 正如弗兰克所说,数据表中的名称将以编程方式确定,因此我无法在函数中对其进行硬编码。但是你的第二种方法确实有效。谢谢。
  • @Frank '最好构造表达式',你的意思是有一个内联函数而不是调用一个现有的函数吗?
  • 我的意思是像github.com/franknarf1/r-tutorial/issues/11 这样的东西,它变得非常混乱,所以我很少构建需要动态确定输入或输出列名的表+函数。这是另一个例子:stackoverflow.com/questions/37007282/… 和更普遍的google.com/…

标签: r data.table


【解决方案1】:

按原样运行您的代码,这是我得到的错误:

dt[,c('head','tail')=f(val),by=group]
# Error: unexpected '=' in "dt2[,c('head','tail')="

问题是使用= 而不是:= 进行分配。

关于你想要一个新的 data.table 的问题:

dt2 <- dt[, setNames(f(val), c('head', 'tail')), by = group]

【讨论】:

  • 谢谢,这行得通。尽管@A5C1D2H2I1M1N2O1R2T1 在评论的前面给出了这个解决方案。仍然接受您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2018-04-24
  • 2014-05-02
相关资源
最近更新 更多