使用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, ...]部分相当于以下索引:

DT1$col1 == vec  

这就像比较DT1col1列和vec的元素。由于vec只有3个元素,这些元素被滚动,并且由于veccol1中的特定值,滚动后第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

最新更新