更快的方法来计算行中的零

时间:2015-04-03 00:55:12

标签: r

所以数据如下所示。 600个实例的93个变量。我想计算前4个变量中的零个数,然后计算接下来的4个变量中的零个数,......一直到第93个变量。目前我有

idx1<-c(1:4)

Z1<-rowSums(Pds[idx1]==0) 

为了完成上述工作,我需要复制并粘贴20次并更改每个变量组的代码。有没有更简单的方法?我还将针对变量的不同组合进行此操作,即每3个变量,每10个变量,每两个变量。我将所有这些保存到新变量中。如果有人想知道,我正在为我的数据挖掘类最终项目做Kaggle Otto小组挑战。像往常一样,感谢所有帮助的人。

 df=    feat_1  feat_2  feat_3  feat_4....
          1       0        0      0
          0       0        0      0
          0       0        0      0
          1       0        0      1
          0       0        0      0
          2       1        0      0
          2       0        0      0
          .        .         .       .
          .        .         .       .
          .        .         .       .
          .        .         .       .

2 个答案:

答案 0 :(得分:3)

让我们从一些示例数据开始。

# Sample data
set.seed(144)
dat <- matrix(sample(0:1, 100, replace=TRUE), 10, 10)

根据需要拆分列标识符后,您将无法走得太远。幸运的是,这是addressed on SO before

# Split into groups of 4
split(seq(ncol(dat)), ceiling(seq(ncol(dat))/4))
# $`1`
# [1] 1 2 3 4
# 
# $`2`
# [1] 5 6 7 8
# 
# $`3`
# [1]  9 10

现在您需要做的就是使用每个分组中的列调用rowSums以获得所需的计数,并将结果合并到一个矩阵中。 sapply方便了:

grouped.sum <- function(dat, size) sapply(split(seq(ncol(dat)), ceiling(seq(ncol(dat))/size)), function(x) rowSums(dat[,x,drop=F] == 0))
grouped.sum(dat, 3)
#       1 2 3 4
#  [1,] 2 1 1 0
#  [2,] 2 2 2 1
#  [3,] 0 2 3 0
#  [4,] 1 1 2 0
#  [5,] 3 2 1 0
#  [6,] 1 2 0 0
#  [7,] 2 1 2 1
#  [8,] 1 2 2 0
#  [9,] 1 2 1 1
# [10,] 2 1 1 1
grouped.sum(dat, 4)
#       1 2 3
#  [1,] 2 1 1
#  [2,] 3 2 2
#  [3,] 1 3 1
#  [4,] 1 2 1
#  [5,] 4 2 0
#  [6,] 2 1 0
#  [7,] 3 2 1
#  [8,] 1 3 1
#  [9,] 2 1 2
# [10,] 2 2 1

答案 1 :(得分:3)

rowsum对此有好处 - 你转置矩阵然后用分组变量分割行(这相当于按列分组)

n <- 4

idx <- rep(1:ceiling(ncol(dat)/n), each=n, length=ncol(dat))

t(rowsum(t(!dat)*1, idx)