【问题标题】:Combinations of binary values in rr 中二进制值的组合
【发布时间】:2013-05-29 00:20:31
【问题描述】:

我是 R 新手,想对列的组合做一些工作。我正在努力编写一些代码来计算多个列组合中 1 的数量。假设我有以下列:

A B C D

我想先计算每一列(A、B、C、D)中 1 的数量。 然后是每个 2 列组合(AB、AC、AD、BC、BD、CD)中 1 的数量。 然后是每个 3 列组合(ABC、ACD、BCD)中 1 的数量 然后是所有列中 1 的个数(ABCD)

实际的数据框大约有 10 列左右。

建议为每个组合创建一个二进制值,然后将所有这些二进制值放在一个数组中,但我们将不胜感激。 非常感谢

【问题讨论】:

  • 合并二进制列A和B是什么意思?计算 OR 或 AND?
  • OR,计算出现在 A 或 B 列中的所有 1。
  • 嗯,我不确定您是否知道我所指的 OR...所以只是澄清一下,如果 A 是 (0, 0, 1, 1) 而 B 是 (0, 1, 1, 0),A和B结合的结果应该是3还是4?
  • 3,出现在 A 或 B 列中的所有 1。
  • 因此,尽管措辞模棱两可,但您确实在寻找逻辑 OR。最好说您正在寻找至少包含1 的行数,因为它与子矩阵中1 的总数不同。希望我的回答能为您提供解决方案。

标签: r binary combinations


【解决方案1】:

一些样本数据:

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

【讨论】:

  • 是否可以只返回唯一的组合,这样在本例中所有组合最后加起来为 10?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 2014-09-09
  • 2021-12-19
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多