我在理解传递的引用属性方面遇到了一些麻烦data.table.有些操作似乎"打破"了参考,我想准确理解发生了什么.
在data.table从另一个创建a 时data.table(通过<-,然后更新新表:=,原始表也会被更改.这是预期的,按照:
?data.table::copy
和stackoverflow:传递引用操作在数据表包中
这是一个例子:
library(data.table)
DT <- data.table(a=c(1,2), b=c(11,12))
print(DT)
# a b
# [1,] 1 11
# [2,] 2 12
newDT <- DT # reference, not copy
newDT[1, a := 100] # modify new DT
print(DT) # DT is modified too.
# a b
# [1,] 100 11
# [2,] 2 12
Run Code Online (Sandbox Code Playgroud)
但是,如果我:=在<-赋值和:=上面的行之间插入非基础修改,DT现在不再修改:
DT = data.table(a=c(1,2), b=c(11,12))
newDT …Run Code Online (Sandbox Code Playgroud) 我想创建一个新列,它等于该行所有列的最大值.
这是一个例子:
library(data.table)
data <- data.table(head(iris))
data[ , Species := NULL]
data
Sepal.Length Sepal.Width Petal.Length Petal.Width
1: 5.1 3.5 1.4 0.2
2: 4.9 3.0 1.4 0.2
3: 4.7 3.2 1.3 0.2
4: 4.6 3.1 1.5 0.2
5: 5.0 3.6 1.4 0.2
6: 5.4 3.9 1.7 0.4
Run Code Online (Sandbox Code Playgroud)
我不能在max这里真正使用这个函数,因为它会找到所有列的最大值,例如data[, max_value := max(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)].我想要的是这样的:
Sepal.Length Sepal.Width Petal.Length Petal.Width max_value
1: 5.1 3.5 1.4 0.2 5.1
2: 4.9 3.0 1.4 0.2 4.9
3: 4.7 3.2 1.3 0.2 4.7 …Run Code Online (Sandbox Code Playgroud)