r - 在"by"参数中使用字符向量



在 R 的data.table包中,有没有办法在计算的by参数中使用要分配的字符向量?

下面是使用 mtcars 所需的输出的示例:

mtcars <- data.table(mtcars)
ColSelect <- 'cyl' # One Column Option
mtcars[,.( AveMpg = mean(mpg)), by = .(ColSelect)] # Doesn't work
# Desired Output 
cyl   AveMpg
1:   6 19.74286
2:   4 26.66364
3:   8 15.10000

我知道这可以通过将向量括在括号周围来j使用分配列名。

ColSelect <- 'AveMpg' # Column to be assigned for average mpg value
mtcars[,(ColSelect):= mean(mpg), by = .(cyl)]
head(mtcars)
mpg cyl disp  hp drat    wt  qsec vs am gear carb   AveMpg
1: 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4 19.74286
2: 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4 19.74286
3: 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1 26.66364
4: 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1 19.74286
5: 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2 15.10000
6: 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1 19.74286

为了实现这一目标,是否有关于在by论点中加入什么的建议?

by部分的?data.table来看,它说by接受:

  • 包含逗号分隔的列名的单个字符串(其中空格很重要,因为列名即使在开头或结尾也可能包含空格
    ):例如,DT[, sum(a), by="x,y,z"]
  • 列名的字符向量:例如,DT[, sum(a), by=c("x", "y")]

所以是的,你可以在@cccmir的回应中使用答案。您也可以如@akrun所述使用c(),但这似乎有点无关紧要,除非您想要多列。

不能使用.()语法的原因是,在data.table.()中是list()的别名。根据相同的帮助bylist()语法需要列名表达式 - 而不是字符串。

如果您想使用多个变量并将名称作为字符传递,那么离开by中的示例会有所帮助:

  1. mtcars[,.( AveMpg = mean(mpg)), by = "cyl,am"]
  2. mtcars[,.( AveMpg = mean(mpg)), by = c("cyl","am")]

尝试这样使用它

mtcars <- data.table(mtcars)
ColSelect <- 'cyl' # One Column Option
mtcars[, AveMpg := mean(mpg), by = ColSelect] # Should work

最新更新