【问题标题】:Calculate the frequency of combinations from a set of binary variables从一组二元变量中计算组合的频率
【发布时间】:2021-11-22 14:07:52
【问题描述】:

有没有办法从一组二元变量中计算组合的频率?

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有这些。我只想计算至少有 2 个包含 [1] 的变量的组合。有没有办法计算这个? 如果有任何想法或想法,我将不胜感激!

我的预期输出应该是这样的:

combinations


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

【问题讨论】:

    标签: r combinations frequency


    【解决方案1】:

    试试这个:

    > 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)
      

      【讨论】:

      • 我只是在我的主数据集上获得 NA,有什么办法可以解决这个问题吗?
      【解决方案3】:

      这是另一种选择。首先获取 data.frame 名称的所有组合,然后在每个组合上使用 lapply,检查 rowSums 以查看该组合是否存在于 data.frame 中,然后 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 
      

      【讨论】:

        猜你喜欢
        • 2011-08-18
        • 1970-01-01
        • 1970-01-01
        • 2022-01-27
        • 1970-01-01
        • 1970-01-01
        • 2021-07-28
        • 1970-01-01
        • 2018-05-30
        相关资源
        最近更新 更多