使用data.table通过引用子行分配行

时间:2014-08-12 15:50:43

标签: r data.table

我有以下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]

我错过了什么?

2 个答案:

答案 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 / wherej表示select / update / compute / assignby表示{{1} }}

所以你在这里犯的错误如下:

在您的作业中:group by部分等同于以下索引:

DT1[col1==vec, ...]

这就像将DT1$col1 == vec 的元素col1列与DT1进行比较一样。由于vec只有3个元素,因此元素会被翻转,并且由于vecvec中的特定值,第5和第6个元素在滚动后变为TRUE。 / p>

做你想做的事的正确方法是:

方法1 :(首选)

col1

方法2 :(相当于data.frame,但不是data.table的首选)

DT1[vec, col3 := FALSE]

或者,以下内容也适用:

DT1$col3[vec] <- FALSE

方法3:这是另一种可能性(虽然比第一种方法慢):

DT1[vec]$col3 <- FALSE

希望这会有所帮助!!