所以数据如下所示。 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
. . . .
. . . .
. . . .
. . . .
答案 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)