【发布时间】: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
我一个电话就可以做到吗?
【问题讨论】:
-
你为什么不直接用其中的名字定义
f?f <- 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