首页 > 解决方案 > 选择变量中命名的列时,“.SD”中的警告

问题描述

假设我有一个data.table如下

DT <- data.table(x = rep(c("b", "a", "c"), each = 3), v = c(1, 1, 1, 2, 2, 1, 1, 2, 2), y = c(1, 3, 6), a = 1:9, b = 9:1)

> DT
   x v y a b
1: b 1 1 1 9
2: b 1 3 2 8
3: b 1 6 3 7
4: a 2 1 4 6
5: a 2 3 5 5
6: a 1 6 6 4
7: c 1 1 7 3
8: c 2 3 8 2
9: c 2 6 9 1

我有一个sl <- c("a","b")选择要计算的列的变量rowSums。如果我尝试下面的代码

DT[, ab := rowSums(.SD[, ..sl])]

我仍然能够获得所需的输出,但给出了一条警告消息

DT[, ab := rowSums(.SD[, ..sl])] 警告消息:在[.data.table(.SD, , ..sl) 中:“sl”和“..sl”都存在于调用范围内。为清楚起见,请删除调用范围中的“..sl”变量。

但是,运行时不会出现警告

DT[, ab := rowSums(.SD[, sl, with = FALSE])]

我想知道如何解决使用时的警告问题.SD[, ..sl]。提前致谢!

标签: rdata.table

解决方案


可能要使用的语法是指定.SDcols并调用 the.SD或直接..cols从原始对象调用。根据?data.table

x[, cols] 等价于 x[, ..cols] 和 x[, cols, with=FALSE] 和 x[, .SD, .SDcols=cols]

如果我们检查 的源代码data.table,第 248 行似乎是触发warning

在此处输入图像描述

作为

DT[, exists(..sl, where = DT)]
#[1] TRUE

DT[, .SD[, exists(..sl)]]
#[1] TRUE

DT[, .SD[, exists(..sl, where = .SD)]]
#[1] TRUE

推荐阅读