r - 为什么我不能在 data.table 中使用 .I 删除当前观察结果?
问题描述
最近我看到一个类似这样的问题(找不到链接)
我想在 data.frame 上添加一列,在删除当前观察值的同时计算不同列的方差。
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
我错过了什么?我认为这是.I
传递给函数的问题,但是一个虚拟的例子:
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
包含每个项目的长度为 1 的向量by
dt[ , var_v := dt[id != .BY$id, var(v)], by = id]
每行计算一次方差 ( by = id
)。id != .BY$id
在每次计算中,使用'inner'排除当前行i
。
all.equal(dt$var_v, res)
# [1] TRUE
为什么你的代码不起作用?因为...
.I
是一个整数向量,等于seq_len(nrow(x))
,
...您-.I
不仅会删除当前的观察结果,还会一次性从“v”中删除所有行。
一个小插图,从您的尝试开始(只是没有 assignment :=
)并逐步简化它:
# 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)
推荐阅读
- python-3.x - 如何根据行数据有选择地在 Pandas df 中使用 ffill
- javascript - Vue.js - 如何隐藏带有悬停事件的图像并显示另一个?
- python - 如何使用 for 循环和 if 语句将行附加到 pandas 数据帧
- swift - 如何检查 swift 函数实现
- google-bigquery - Bigquery 中的 Fuzzball
- c# - 无法识别 URI 前缀。元数据包含无法解析的引用:'net.tcp://localhost:8090/'
- oauth - Spring Cloud Gateway - 不透明的令牌
- css - 在引导程序 datetimepicker 中隐藏边框
- excel - 将范围从已关闭的工作簿复制到特定工作表
- amazon-web-services - Amplify 安装到现有 Vue/Bootstrap 项目时出错:您可能需要适当的加载程序来处理此文件类型