gpt4 book ai didi

r - 为什么我不能在 data.table 中使用 .I 删除当前观察?

转载 作者:行者123 更新时间:2023-12-02 06:27:19 24 4
gpt4 key购买 nike

最近看到一个问题(找不到链接)是这样的

I want to add a column on a data.frame that computes the variance of a different column while removing the current observation.

dt = data.table(
id = c(1:13),
v = c(9,5,8,1,25,14,7,87,98,63,32,12,15)
)

因此,使用 for() 循环:

res = NULL
for(i in 1:13){
res[i] = var(dt[-i,v])
}

我尝试在 data.table 中执行此操作,使用 .I 的负索引,但令我惊讶的是,以下均无效:

#1
dt[,var := var(dt[,v][-.I])]

#2
dt[,var := var(dt$v[-.I])]

#3
fun = function(x){
v = c(9,5,8,1,25,14,7,87,98,63,32,12,15)
var(v[-x])
}
dt[,var := fun(.I)]

#4
fun = function(x){
var(dt[-x,v])
}
dt[,var := fun(.I)]

所有这些都给出相同的输出:

    id  v var
1: 1 9 NA
2: 2 5 NA
3: 3 8 NA
4: 4 1 NA
5: 5 25 NA
6: 6 14 NA
7: 7 7 NA
8: 8 87 NA
9: 9 98 NA
10: 10 63 NA
11: 11 32 NA
12: 12 12 NA
13: 13 15 NA

我错过了什么?我认为这是 的问题。我 被传递给函数,但是一个虚拟的例子:

fun = function(x,c){
x*c
}
dt[,dummy := fun(.I,2)]

id v var
1: 1 9 2
2: 2 5 4
3: 3 8 6
4: 4 1 8
5: 5 25 10
6: 6 14 12
7: 7 7 14
8: 8 87 16
9: 9 98 18
10: 10 63 20
11: 11 32 22
12: 12 12 24
13: 13 15 26

工作正常。

为什么我不能在这种特定情况下使用 .I

最佳答案

你可以使用.BY:

a list containing a length 1 vector for each item in by

dt[ , var_v := dt[id != .BY$id,  var(v)], by = id]

方差每行计算一次 (by = id)。在每次计算中,使用“内部”i 中的 id != .BY$id 排除当前行。

all.equal(dt$var_v, res)
# [1] TRUE

为什么您的代码不起作用?因为……

.I is an integer vector equal to seq_len(nrow(x)),

...您的-.I 不仅删除了当前 观察结果,还从“v”中一次性删除了所有 行。

从您的尝试开始的小插图(只是没有赋值 :=)并逐步简化它:

# your attempt
dt[ , var(dt[, v][-.I])]
# [1] NA

# without the `var`, indexing only
dt[ , dt[ , v][-.I]]
# numeric(0)
# an empty vector

# same indexing written in a simpler way
dt[ , v[-.I]]
# numeric(0)

# even more simplified, with a vector of values
# and its corresponding indexes (equivalent to .I)
v <- as.numeric(11:14)
i <- 1:4
v[i]
# [1] 11 12 13 14

x[-i]
# numeric(0)

关于r - 为什么我不能在 data.table 中使用 .I 删除当前观察?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54694602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com