比较R data.table中多列值的向量

时间:2016-06-01 12:13:09

标签: r data.table

在以下示例中:

DT <- data.table(A1=c(1,2),A2=c(2,3),B1=c(1,2),B2=c(3,4),B3=c(2,5))

我想检查每一行是否A1和A2列中的值都出现在B1,B2或B3中。

如果我这样做:

DT[,BOTH_PRESENT:=!(F %in% (c(A1,A2) %in% c(B1,B2,B3)))]

这会产生:

   A1 A2 B1 B2 B3 BOTH_PRESENT
1:  1  2  1  3  2         TRUE
2:  2  3  2  4  5         TRUE

虽然我希望第一行为True而第二行为False。

# Row 1
!(F %in% (c(1,2) %in% c(1,3,2)))
# Row 2
!(F %in% (c(2,3) %in% c(2,4,5)))

我应该如何更改我的代码?

由于我的真实数据集在列方面要大得多,因此像(A1 == B1 | A1 == B2 | A1 == B3) & (A2 == B1 | A2 == B2 | A2 == B3)这样的表达式不是一个很好的解决方案。

1 个答案:

答案 0 :(得分:2)

我们可以按data.table,unlist'A'列的行序列进行分组,检查all这些元素是%in% unlist DT[, BOTH_PRESENT := all(unlist(.SD[, 1:2, with = FALSE]) %in% unlist(.SD[, 3:5, with = FALSE])), by = 1:nrow(DT)] ed'B'列。

 DT[,BOTH_PRESENT:= all(c(A1, A2) %in% c(B1,B2,B3)), by = seq_len(nrow(DT))]

或者@Roland提到,

split()