在 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()
的别名。根据相同的帮助by
,list()
语法需要列名表达式 - 而不是字符串。
如果您想使用多个变量并将名称作为字符传递,那么离开by
中的示例会有所帮助:
mtcars[,.( AveMpg = mean(mpg)), by = "cyl,am"]
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