从一组二元变量中计算组合的频率。

3

有没有一种方法可以从一组二元变量中计算组合频率?

a <- c(0,1,0,1,0)
b <- c(1,1,0,1,0)
c <- c(0,1,0,0,0)

> data.frame(a, b, c)
  a b c
1 0 1 0
2 1 1 1
3 0 0 0
4 1 1 0
5 0 0 0

在这个例子中,组合 a + b 是最常见的,因为 obj. 2 和 4 都有它们。我只想计算至少包含 [1] 的 2 个变量的组合。是否有一种方法可以计算这个值?

我会感激任何想法或建议!

我的期望输出应该像这样:

combinations


1 ab  2
2 ac  1
3 bc  1
4 abc 1

3个回答

6

试试这个:

> X <- data.frame(a, b, c)
> apply(model.matrix(data=X, ~a*b*c), 2, sum)[-(1:4)]

 a:b   a:c   b:c a:b:c 
    2     1     1     1 

model.matrix会为每一行数据编码所有交互作用,然后我使用apply函数对这些行求和。前四个元素是截距以及abc的主要效应,而这些你并不需要。


2
也许这会有所帮助。
unlist(
  sapply(
    2:3,
    function(k) {
      setNames(
        combn(df, k, function(x) sum(Reduce("*", x))),
        combn(names(df), k, toString)
      )
    }
  )
)

这提供了

   a, b    a, c    b, c a, b, c 
      2       1       1       1

数据

df <- data.frame(a, b, c)

我的主要数据集只有NAs,有什么方法可以修复吗? - Sascha

1

这里有另一个选项。首先获取您的数据框名称的所有组合,然后对每个组合使用lapply,检查rowSums以查看该组合是否存在于数据框中,并sum所有找到的组合。

res <- unlist(Map(combn, list(names(df)), 2:3, simplify = F), recursive = F)
unlist(lapply(res, function(x) {
  setNames(data.frame(sum(as.integer(rowSums(df[,x] == 1, na.rm = T) == length(x)))),
                      paste0(x, collapse = ''))
}), use.names = T)

输出

 ab  ac  bc abc 
  2   1   1   1 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接