为什么我不能在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

一个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”中的所有行。

一个小插图,从您的尝试开始(只是没有分配:=),并逐步简化了它:

# 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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我不能在Swift中的for循环中使用i ++

为什么不能在data.table中使用`predict`?

为什么我不能在我的代码中使用“ balance ”?

为什么我不能在开关案例中使用枚举?

为什么我不能在Swift中使用'object == nil'?

为什么我不能在CSS Variable中使用rgba?

为什么我不能在界面中使用默认方法?

为什么我不能在匿名类中使用<Class> .this?

为什么我不能在TRecord中使用Variable?

为什么我不能在列表中使用匿名函数?

为什么我不能在 Spark 中使用 combineByKey?

为什么我不能在Spark的mapPartitions中使用foreach

为什么我不能在Laravel中使用关系方法?

为什么我不能在Swift中使用let in协议?

为什么我不能在Flutter中使用某些图标?

为什么不能在我的Magic Square程序中使用

为什么我不能在Activity中使用FloatingActionButton

为什么我不能在Crontab中使用Python 3?

为什么我不能在grep中使用^ \ s?

为什么我不能在 observable 中使用 switchMap

为什么我不能在 useEffect 中使用 dispatch a thunk?

为什么我不能在blazor中使用JSInterop?

为什么我不能在Python中使用“ +”合并字典?

为什么我不能在App Component中使用MyContext?

为什么我不能在JCreator中使用JavaFX?

为什么我不能在Xampp中使用htaccess?

为什么我不能在Matlab中使用函数readframe

为什么我不能在输入中使用空格字符?

为什么我不能在 yyerror (Yacc) 中使用 yytext