R 为特定的data.table列和行赋值

R 为特定的data.table列和行赋值,r,data.table,R,Data.table,仍然理解这个伟大的包裹。。。谁能给我解释一下这个错误的原因吗?谢谢 library(data.table) DT <- data.table(id = LETTERS, var1 = rnorm(26), var2 = rnorm(26)) > DT[2, list(var1, var2)] var1 var2 1: -0.8628479332 -0.23674929

仍然理解这个伟大的包裹。。。谁能给我解释一下这个错误的原因吗?谢谢

library(data.table)

DT <- data.table(id   = LETTERS,
                 var1 = rnorm(26),
                 var2 = rnorm(26))

> DT[2, list(var1, var2)]
            var1          var2
1: -0.8628479332 -0.2367492928
> DT[2, c(var1, var2)]
[1] -0.8628479332 -0.2367492928
> 
> DT[2, list(var1, var2)] <- DT[8, list(var1, var2)]
Error in `[<-.data.table`(`*tmp*`, 2, list(var1, var2), value = list(var1 = -0.394006912428776,  : 
  object 'var1' not found
> DT[2, c(var1, var2)] <- DT[8, c(var1, var2)]
Error in `[<-.data.table`(`*tmp*`, 2, c(var1, var2), value = c(-0.394006912428776,  : 
  object 'var1' not found
库(data.table)
DT DT[2,list(var1,var2)]
var1 var2
1: -0.8628479332 -0.2367492928
>DT[2,c(var1,var2)]
[1] -0.8628479332 -0.2367492928
> 

>DT[2,list(var1,var2)]首先,建议使用
:=
而不是
[这太完美了!!!再清楚不过了。最后一个问题:让我困惑的是找不到
对象“var1”的错误类型
,如何使用
as.list
避免此类错误?非常感谢!在您的解决方案中
DT[1,c(“y”,“z”)]
require(data.table)
DT <- data.table(x = 1:5, y = 6:10, z = 11:15)
DT[2, y := DT[5, y]] 
DT[2, `:=`(y = DT[5, y])]
DT[2, c("y", "z") := as.list(DT[5, c(y, z)])]
DT[2, `:=`(y = DT[5, y], z = DT[5, z])]
DT <- data.table(x = 1:5, y = 6:10, z = 11:15)
DT[1, c("y", "z")] <- as.list(DT[5, c(y, z)])
DT[1, 2:3] <- as.list(DT[5, c(y, z)])
y <- "y"
z <- "z"
# And now try your second case: 
DT[2, c(y, z)] <- as.list(DT[5, c(y, z)])
# the left side takes values from the assignments you made above
# the right side y and z are evaluated within the environment of your data.table
# and so it sees the columns y and z as variables and their values are picked accordingly
y <- "y"
z <- "z"
DT[2, list(y, z)] <- as.list(DT[5, c(y, z)])

# Error in `[<-.data.table`(`*tmp*`, 2, list(y, z), value = list(10L, 15L)) : 
#   j must be atomic vector, see ?is.atomic
DT <- data.table(x = 1:5, y = 6:10, z = 11:15)
tracemem(DT)
# [1] "<0x7fbefb89b580>"

DT[1, c("y", "z") := list(100L, 110L)]
tracemem(DT)
# [1] "<0x7fbefb89b580>"

DT[2, c("y", "z")] <- list(200L, 201L)
# tracemem[0x7fbefacc4fa0 -> 0x7fbefd297838]: # copied, inefficient