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