我有以下数据表:
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, ...]
部分相当于以下索引:
DT1$col1 == vec
这就像比较DT1
的col1
列和vec
的元素。由于vec
只有3个元素,这些元素被滚动,并且由于vec
和col1
中的特定值,滚动后第5和第6个元素结果为TRUE。
正确的做法是:
方法一:(首选)
DT1[vec, col3 := FALSE]
方法2:(相当于data.frame,但不适合data.table)
DT1$col3[vec] <- FALSE
或者,下面也可以:
DT1[vec]$col3 <- FALSE
方法3:这是另一种可能性(虽然比第一种方法慢):
DT1[col1 %in% vec, col3 := FALSE]
希望这有帮助!!
使用%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