我有以下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]
我错过了什么?
答案 0 :(得分:1)
使用%in%
,因为它返回逻辑向量:
> DT1<-data.table(col1=c(1,2,3,4,5,6,7),col2=letters[1:7],col3=rep(TRUE,7))
> vec <- c(2,5,6)
> DT1[col1 %in% vec, col3 := FALSE]
> DT1
col1 col2 col3
1: 1 a TRUE
2: 2 b FALSE
3: 3 c TRUE
4: 4 d TRUE
5: 5 e FALSE
6: 6 f FALSE
7: 7 g TRUE
答案 1 :(得分:1)
data.table
的格式为DT[i,j,by]
,其中i
表示location / where
,j
表示select / update / compute / assign
,by
表示{{1} }}
所以你在这里犯的错误如下:
在您的作业中:group by
部分等同于以下索引:
DT1[col1==vec, ...]
这就像将DT1$col1 == vec
的元素col1
列与DT1
进行比较一样。由于vec
只有3个元素,因此元素会被翻转,并且由于vec
和vec
中的特定值,第5和第6个元素在滚动后变为TRUE。 / p>
做你想做的事的正确方法是:
方法1 :(首选)
col1
方法2 :(相当于data.frame,但不是data.table的首选)
DT1[vec, col3 := FALSE]
或者,以下内容也适用:
DT1$col3[vec] <- FALSE
方法3:这是另一种可能性(虽然比第一种方法慢):
DT1[vec]$col3 <- FALSE
希望这会有所帮助!!