我有以下data.table:
DT1 <- data.table(col1 = c(1,2,3,4,5,6,7), col2 = letters[1:7], col3 = rep(TRUE,7))
col1 col2 col3
1: 1 a TRUE
2: 2 b TRUE
3: 3 c TRUE
4: 4 d TRUE
5: 5 e TRUE
6: 6 f TRUE
7: 7 g TRUE
然后我定义:
vec <- c(2,5,6)
与:
DT1[col1 == vec, col3 := FALSE]
我得到:
col1 col2 col3
1: 1 a TRUE
2: 2 b TRUE
3: 3 c TRUE
4: 4 d TRUE
5: 5 e FALSE
6: 6 f FALSE
7: 7 g TRUE
我希望col3
将第二行设置为FALSE
此处,事实并非如此。
但是例如,这按我预期的那样工作:
DT1[vec, col3 := FALSE]
我想念什么?
data.table
的格式DT[i,j,by]
与i
意义location / where
,j
意义select / update / compute / assign
和by
含义group by
。
因此,您在这里犯的错误如下:
在您的作业中:DT1[col1==vec, ...]
part等效于以下索引:
DT1$col1 == vec
这就如同比较元件col1
的柱DT1
用vec
。由于vec
只有3个元素,因此将这些元素进行翻转,并且由于您vec
和中的特定值col1
,因此第5个元素和第6个元素在翻转后变为TRUE。
做您想做的正确方法是:
方法1 :(首选)
DT1[vec, col3 := FALSE]
方法2 :(与data.frame等效,但对data.table则不推荐使用)
DT1$col3[vec] <- FALSE
或者,以下方法也将起作用:
DT1[vec]$col3 <- FALSE
方法3:这是另一种可能性(尽管比第一种方法慢):
DT1[col1 %in% vec, col3 := FALSE]
希望这可以帮助!!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句