R 跨多个列的逻辑向量

R 跨多个列的逻辑向量,r,data.table,R,Data.table,我试图在data.table中的许多列上运行逻辑or语句,但在编写代码时遇到了问题。我的列具有如下表所示的模式。如果需要的话,我可以使用一个常规的逻辑向量,但我想知道我是否能找到一种方法来迭代a1、a2、a3等,因为我的实际数据集有许多“a”类型的列 提前谢谢 library(data.table) x <- data.table(a1 = c(1, 4, 5, 6), a2 = c(2, 4, 1, 10), z = c(9, 10, 12, 12)) # this works but

我试图在data.table中的许多列上运行逻辑or语句,但在编写代码时遇到了问题。我的列具有如下表所示的模式。如果需要的话,我可以使用一个常规的逻辑向量,但我想知道我是否能找到一种方法来迭代a1、a2、a3等,因为我的实际数据集有许多“a”类型的列

提前谢谢

library(data.table)
x <- data.table(a1 = c(1, 4, 5, 6), a2 = c(2, 4, 1, 10), z = c(9, 10, 12, 12))

# this works but does not work for lots of a1, a2, a3 colnames 
# because code is too long and unwieldy
x[a1 == 1 | a2 == 1 , b:= 1] 

# this is broken and returns the following error
x[colnames(x)[grep("a", names(x))] == 1, b := 1] 
输出如下所示:

   a1 a2  z  b
1:  1  2  9  1
2:  4  4 10 NA
3:  5  1 12  1
4:  6 10 12 NA
尝试使用遮罩:

x$b <- 0
x[rowSums(ifelse(x[, list(a1, a2)] == 1, 1, 0)) > 0, b := 1]

ifelse(x[,list(a1,a2)]==1,1,0)
返回一个数据表,其中
a
列中只有
1
。然后我使用行和来水平求和,如果这些和中的任何一个是
>0
,这意味着在给定行的至少一列中有一个
1
,所以我只选择了这些行,当我尝试
x[a1==1 | a2==1,b:=1]
时,将
b
设置为
1

,我根本没有得到任何输出。您想要的结果是什么样的?我编辑了上面的内容以添加输出。如果您重新运行x,您将获得上述输出。
x[,v:=Reduce(` |`,lappy(.SD,`=`,1)),.SDcols=a1:a2]
适用于此示例。您可以阅读文档,了解如何以其他方式指定
.SDcols
。通常,在data.table/data.frame上按行计算效率不高。相关和
x$b <- 0
x[rowSums(ifelse(x[, list(a1, a2)] == 1, 1, 0)) > 0, b := 1]
x[rowSums(ifelse(x[, c(1:100)] == 1, 1, 0) > 0, b := 1]