我是 R 新手,想对列的组合做一些工作。我正在努力编写一些代码来计算多个列组合中 1 的数量。假设我有以下列:
A B C D
我想先计算每一列(A、B、C、D)中 1 的数量。然后是每个 2 列组合(AB、AC、AD、BC、BD、CD)中 1 的数量。然后是每个 3 列组合中 1 的数量(ABC、ACD、BCD) 然后是所有列中 1 的数量(ABCD)
实际的数据框大约有 10 列左右。
建议为每个组合创建一个二进制值,然后将所有这些二进制值放在一个数组中,但任何建议都将不胜感激。非常感谢
我是 R 新手,想对列的组合做一些工作。我正在努力编写一些代码来计算多个列组合中 1 的数量。假设我有以下列:
A B C D
我想先计算每一列(A、B、C、D)中 1 的数量。然后是每个 2 列组合(AB、AC、AD、BC、BD、CD)中 1 的数量。然后是每个 3 列组合中 1 的数量(ABC、ACD、BCD) 然后是所有列中 1 的数量(ABCD)
实际的数据框大约有 10 列左右。
建议为每个组合创建一个二进制值,然后将所有这些二进制值放在一个数组中,但任何建议都将不胜感激。非常感谢
一些样本数据:
n <- 10
dat <- data.frame(A = sample(0:1, n, replace = TRUE),
B = sample(0:1, n, replace = TRUE),
C = sample(0:1, n, replace = TRUE),
D = sample(0:1, n, replace = TRUE))
一个给定要组合的列数的函数,计算所有组合和相应的总和:
count.or <- function(dat, n = 2) {
or.sum <- function(cols) sum(rowSums(dat[cols]) > 0)
counts <- combn(colnames(dat), n, FUN = or.sum)
names <- combn(colnames(dat), n, FUN = paste, collapse = "")
setNames(counts, names)
}
在行动:
count.or(dat, 1)
# A B C D
# 6 6 5 9
count.or(dat, 2)
# AB AC AD BC BD CD
# 8 7 9 9 10 9
count.or(dat, 3)
# ABC ABD ACD BCD
# 9 10 9 10
count.or(dat, 4)
# ABCD
# 10
或一通电话:
unlist(lapply(1:4, count.or, dat = dat))
# A B C D AB AC AD BC BD CD ABC ABD ACD BCD ABCD
# 6 6 5 9 8 7 9 9 10 9 9 10 9 10 10