R按顺序计数列

R按顺序计数列,r,data.table,inclusion,R,Data.table,Inclusion,说这是我的数据。我希望这样做:计算DROP1等于1的值的数量;然后在DROP1等于1的情况下,统计DROP2的值个数;然后在DROP2等于1和DROP1等于1的情况下,计算DROP3等于1的值的数量。我可以手动执行此操作,但我们的实际数据文件很大,有80多个DROP变量。理想的输出只是一个打印输出,看起来: set.seed(0) data = data.frame(ID = 1:1000, X1=runif(1000), X2=runif(1000), DROP1=sample(0:1

说这是我的数据。我希望这样做:计算DROP1等于1的值的数量;然后在DROP1等于1的情况下,统计DROP2的值个数;然后在DROP2等于1和DROP1等于1的情况下,计算DROP3等于1的值的数量。我可以手动执行此操作,但我们的实际数据文件很大,有80多个DROP变量。理想的输出只是一个打印输出,看起来:

    set.seed(0)
data = data.frame(ID = 1:1000, X1=runif(1000), X2=runif(1000), DROP1=sample(0:1,r=T),DROP2=sample(0:1,r=T),DROP3=sample(0:1,r=T))

这里有一个带有
base R
的选项,我们使用
grep
获得“DROP”列名(“nm1”)。然后循环这些序列,得到其中的
seq
,对数据列进行子集,使用
Reduce
获得
&
的逻辑向量(只有当所有列的行都是1,即1=>TRUE,0=>FALSE时才为TRUE),并获得这些元素的
sum
以返回计数

DROP1, #
DROP2 (AFTER DROP1), #
DROP3 (AFTER DROP1 & DROP2), #
数据
set.seed(0)

数据这里有一个带有
base R
的选项,我们使用
grep
获取“DROP”列名('nm1')。然后循环这些序列,得到其中的
seq
,对数据列进行子集,使用
Reduce
获得
&
的逻辑向量(只有当所有列的行都是1,即1=>TRUE,0=>FALSE时才为TRUE),并获得这些元素的
sum
以返回计数

DROP1, #
DROP2 (AFTER DROP1), #
DROP3 (AFTER DROP1 & DROP2), #
数据
set.seed(0)
数据另一种选择:

set.seed(0)
data=data.frame(ID=1:1000,X1=runif(1000),X2=runif(1000),DROP1=sample(0:11000,r=T),DROP2=sample(0:11000,r=T),DROP3=sample(0:11000,r=T))
tb另一种选择:

set.seed(0)
data=data.frame(ID=1:1000,X1=runif(1000),X2=runif(1000),DROP1=sample(0:11000,r=T),DROP2=sample(0:11000,r=T),DROP3=sample(0:11000,r=T))

tb@akrun我觉得您可能有一个智能数据表解决方案!奇怪的是,当我运行您的示例时,所有drop2/drop3列都是
0
@akrun我觉得您可能有一个智能数据表解决方案!奇怪的是,当我运行您的示例时,所有drop2/drop3列都是
0
library(data.table)
setDT(data)
lapply(seq_along(nm1), function(i) {
         i1 <- seq(i)
         data[, sum(Reduce(`&`, .SD)), .SDcols = nm1[i1]]

    })
set.seed(0)
data <- data.frame(ID = 1:1000, X1=runif(1000), X2=runif(1000), 
           DROP1=sample(0:1,1000, replace = TRUE),
           DROP2=sample(0:1,1000, replace = TRUE),
           DROP3=sample(0:1,1000,replace = TRUE))