data.table中,默认情况下在with = TRUE框架内评估jx。这样有助于将列名用作变量。并且当with = FALSE时,j是要选择的名称或位置的向量。

我设法找到了with = FALSE的一些示例。

set.seed(1234)
DT <- data.table(x=rep(c(1,2,3),each=4), y=c("A","B"), v=sample(1:100,12))

## The askers's solution
#first step is to create cumsum columns
colNames <- c("x","v"); newColNames <- paste0("SUM.",colNames)
DT[, newColNames := lapply(.SD,cumsum) ,by=y, .SDcols = colNames, with=FALSE];
test <- DT[, newColNames:=lapply(.SD,cumsum) ,by=y, .SDcols=colNames, with=TRUE];

我们可以检查DT是:
> DT                       # setting `with=FALSE` - what I require
    x y  v SUM.x SUM.v
 1: 1 A 12     1    12
 2: 1 B 62     1    62
 3: 1 A 60     2    72
 4: 1 B 61     2   123
 5: 2 A 83     4   155
 6: 2 B 97     4   220
 7: 2 A  1     6   156
 8: 2 B 22     6   242
 9: 3 A 99     9   255
10: 3 B 47     9   289
11: 3 A 63    12   318
12: 3 B 49    12   338
test是:
> test                     # this is when setting " with = TRUE"
    x y  v newColNames
 1: 1 A 12           1
 2: 1 B 62           1
 3: 1 A 60           2
 4: 1 B 61           2
 5: 2 A 83           4
 6: 2 B 97           4
 7: 2 A  1           6
 8: 2 B 22           6
 9: 3 A 99           9
10: 3 B 47           9
11: 3 A 63          12
12: 3 B 49          12

我不明白为什么在设置with = TRUE时结果是这样的。所以我的问题基本上是with = TRUE什么时候有用?

我不明白为什么默认设置是with = TRUE,尽管一定有很好的理由。

非常感谢!

最佳答案

我明白你的意思。我们已不再将with=TRUE|FALSE:=结合使用。由于尚不清楚with=TRUE是指:=的左侧还是右侧。取而代之的是,现在首选将:=的LHS括在方括号中。

DT[, x.sum:=cumsum(x)]     # assign cumsum(x) to the column called "x.sum"
DT[, (target):=cumsum(x)]  # assign to the name contained in target's value

正如贾斯汀(Justin)提到的,大多数时候,我们会分配给我们预先知道的新的或现有的列。换句话说,最常见的是,分配给它的列不保存在变量中。我们做了很多事情,所以需要方便。就是说,data.table是灵活的,并且允许您以编程方式定义目标列名称。

我想可以这样认为:
DT[, "x.sum":=cumsum(x)]   # assign cumsum(x) to the column called "x.sum"
DT[, x.sum:=cumsum(x)]     # assign to the name contained in x.sum's contents.

但是,由于:=是一个赋值运算符,并且在j的范围内评估了DT,对我来说,如果未将DT[, x.sum:=cumsum(x)]分配给x.sum列,则会造成困惑。

明确的方括号(target):=表示某种求值方式,因此语法更加清晰。反正在我心中。当然,您也可以直接在paste0的左侧直接调用:=等,而无需with=FALSE;例如。,
DT[, paste0("SUM.",colNames) := lapply(.SD, ...), by=...]

简而言之,当我使用with时,我从不使用:=

关于r - 使用:=,时,为什么with = TRUE是默认值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21239067/

10-14 05:24