【问题标题】:Refer to columns in R data.table in expressions that do not update by reference在不通过引用更新的表达式中引用 R data.table 中的列
【发布时间】:2020-09-30 22:53:56
【问题描述】:

我正在使用data.table v. 1.12.8。我正在尝试使用()get() 引用带有变量的列。它失败了,我不明白为什么。这种语法在使用:= 并通过引用更新时确实有效(请参阅thisthis 问题)。

library(data.table)
X <- data.table(id = 1:5, group = c(1,1,2,2,2), v1 = c(10,12,14,16,18), type_v1 = c("t1","t2","t1","t1","t2"))
this_var <- "v1"
X[, .("v1" = sum(v1)), by = group] # this works
X[, .((this_var) = sum(get(this_var))), by = group] # this does not

我知道,对于我的示例,我可以只使用 .SD,但我的使用需要动态且单独地引用列,而无需更新原始 data.table。

【问题讨论】:

    标签: r group-by data.table


    【解决方案1】:

    它不适用于 lhs。我们可以使用setNames

    X[, setNames(.(sum(get(this_var))), this_var), by = group] 
    

    或者之后setnames

    setnames(X[,  sum(.SD[[1]]), by = group, .SDcols = this_var], 'V1', this_var)[]
    

    -输出

    #   group v1
    #1:     1 22
    #2:     2 48
    

    【讨论】:

    • 有趣。为什么 data.table 根据它是 := 还是 = 表达式来区别对待 LHS,因此在后一种情况下必须使用 setNames,是否有一些原因?
    • @roussanoff 通常= 会按字面意思计算名称,而不是存储在该对象中的值。
    猜你喜欢
    • 1970-01-01
    • 2017-11-04
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 2021-12-28
    • 2017-08-01
    相关资源
    最近更新 更多