我试图选择一行,然后在函数内部更新data.table的列。我发现我用来选择行的条件不起作用,整个data.table正在更新。请参见下面的示例。
library(data.table)
set.seed(123)
dt = data.table(id = as.character(seq(1:10)), V1 = runif(10, 10, 100))
示例“ dt”看起来像
id V1
1: 1 35.88198
2: 2 80.94746
3: 3 46.80792
4: 4 89.47157
5: 5 94.64206
下面的函数(“ DTsubset”)基于3种选择传递的data.table子集的方式返回3个data.table的列表。我希望该函数返回3个相同的data.tables,但是当传递的对象与要比较的data.table的列具有相同的对象名称时,它也将返回整个data.table(对于“ subset1”,其中“ id”为与“ DT $ id”相比)。
DTsubset = function(DT, id) {
subset1 = DT[ which(DT$id == id), ]
# returns entire dt??
index = which(DT$id == id)
subset2 = DT[ index, ]
# return subset when row index is explicitly passed
idbutnotnamedid = id
subset3 = DT[ which(DT$id == idbutnotnamedid)]
# return subset when passed id is not named "id"
return( list( subset1, subset2, subset3 ))
}
DTsubset(dt, "2")
[[1]]
id V1
1: 1 35.88198
2: 2 80.94746
3: 3 46.80792
4: 4 89.47157
5: 5 94.64206
[[2]]
id V1
1: 2 80.94746
[[3]]
id V1
1: 2 80.94746
如果有人能解释为什么会观察到上述行为,这也许是最有效的方式,它可以对一个行进行子集化并更新给定data.table上的值,这将是我的感激之情。