【问题标题】:How to find the most commonly occurring combinations of Boolean variables by row in R如何在R中按行查找最常见的布尔变量组合
【发布时间】:2021-08-19 00:00:15
【问题描述】:

我有一系列 14 个布尔变量,我想找出 3 个或更多变量的前 3 个组合(其中值 == 1)。

样本数据:

df <- data.frame(ID   = c(1, 2, 3, 4, 5, 6, 7, 8),
                 var1 = c(0, 0, 1, 1, 1, 0, 0, 1),
                 var2 = c(1, 0, 0, 1, 1, 1, 1, 0),
                 var3 = c(0, 0, 1, 1, 1, 1, 0, 0),
                 var4 = c(1, 1, 1, 1, 1, 0, 1, 1),
                 var5 = c(0, 0, 0, 1, 1, 0, 1, 1)
                 )
df

> df
  ID var1 var2 var3 var4 var5
1  1    0    1    0    1    0
2  2    0    0    0    1    0
3  3    1    0    1    1    0
4  4    1    1    1    1    1
5  5    1    1    1    1    1
6  6    0    1    1    0    0
7  7    0    1    0    1    1
8  8    1    0    0    1    1

我找到了一个解决方案,可以将所有列名放在一起,每次唯一出现:

# Bring to long format
df_long <- df %>%  
  melt(id.vars = "ID")  

# Collapse the variables that have a '1' together per row
df_combo <- ddply(df_long, "ID", summarize, 
                   combos = paste(variable[value == 1], collapse = "/")) 



> df_combo
  ID                   combos
1  1                var2/var4
2  2                     var4
3  3           var1/var3/var4
4  4 var1/var2/var3/var4/var5
5  5 var1/var2/var3/var4/var5
6  6                var2/var3
7  7           var2/var4/var5
8  8           var1/var4/var5

如果我只想计算唯一组合,这很好,但我想知道 3 个或更多变量的每个组合出现的次数,即使在其他变量也出现的情况下也是如此。在上面的示例中,组合 (var1/var4/var5) 出现了 3 次,但在其他两个变量旁边出现了两次。

必须有一种简单的方法来提取这些信息,只是想不到。谢谢你的帮助!!

【问题讨论】:

    标签: r


    【解决方案1】:

    尝试使用combn 作为主力函数。

    arr <- which(df[-1] == 1, arr.ind=TRUE)
    tmp <- tapply(arr[,"col"], arr[,"row"], 
               FUN=function(x) if (length(x) >= 3) combn(x,3, simplify=FALSE) )
    tmp <- data.frame(do.call(rbind, unlist(tmp, rec=FALSE)))
    aggregate(count ~ . , cbind(tmp, count=1), sum)
    
    ##   X1 X2 X3 count
    ##1   1  2  3     2
    ##2   1  2  4     2
    ##3   1  3  4     3
    ##4   2  3  4     2
    ##5   1  2  5     2
    ##6   1  3  5     2
    ##7   2  3  5     2
    ##8   1  4  5     3
    ##9   2  4  5     3
    ##10  3  4  5     2
    

    【讨论】:

      猜你喜欢
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多