【问题标题】:How to count the number of combinations of boolean data in R如何计算R中布尔数据组合的数量
【发布时间】:2011-11-03 08:07:33
【问题描述】:

根据多个布尔字段确定因素或创建新类别字段的最佳方法是什么?在这个例子中,我需要计算独特药物组合的数量。

   > MultPsychMeds
       ID OLANZAPINE HALOPERIDOL QUETIAPINE RISPERIDONE
    1   A          1           1          0           0
    2   B          1           0          1           0
    3   C          1           0          1           0
    4   D          1           0          1           0
    5   E          1           0          0           1
    6   F          1           0          0           1
    7   G          1           0          0           1
    8   H          1           0          0           1
    9   I          0           1          1           0
    10  J          0           1          1           0

也许另一种说法是我需要对这些对进行透视或交叉制表。最终结果需要类似于:

Combination            Count
OLANZAPINE/HALOPERIDOL     1
OLANZAPINE/QUETIAPINE      3
OLANZAPINE/RISPERIDONE     4
HALOPERIDOL/QUETIAPINE     2

这个数据框可以在 R 中复制:

MultPsychMeds <- structure(list(ID = structure(1:10, .Label = c("A", "B", "C", 
"D", "E", "F", "G", "H", "I", "J"), class = "factor"), OLANZAPINE = c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L), HALOPERIDOL = c(1L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L), QUETIAPINE = c(0L, 1L, 1L, 1L, 
0L, 0L, 0L, 0L, 1L, 1L), RISPERIDONE = c(0L, 0L, 0L, 0L, 1L, 
1L, 1L, 1L, 0L, 0L)), .Names = c("ID", "OLANZAPINE", "HALOPERIDOL", 
"QUETIAPINE", "RISPERIDONE"), class = "data.frame", row.names = c(NA, 
-10L))

【问题讨论】:

  • +1 用于提供数据。但是,我相信您需要更新您的标题,因为似乎没有涉及布尔值(逻辑),也没有进行任何“转换”。您可以将其修改为“计算同时出现的次数”或类似的内容吗?
  • 谢谢。修改了标题以匹配实际问题。关于布尔值,原始数据包括 0 代表 FALSE 和 1 代表 TRUE,当从 .csv 文件加载时,R 将这些变量设置为整数。如果先将这些转换为逻辑变量,这个过程会更好吗?
  • 我认为对 boolean 的引用很好且直观,据我所知,R 等于 1 和 TRUE 为一且相同(可能存在不正确的情况)。例如,&gt; 1 == TRUE [1] TRUE

标签: r


【解决方案1】:

这是使用reshapeplyr 包的一种方法:

library(reshape)
library(plyr)

#Melt into long format
dat.m <- melt(MultPsychMeds, id.vars = "ID")
#Group at the ID level and paste the drugs together with "/"
out <- ddply(dat.m, "ID", summarize, combos = paste(variable[value == 1], collapse = "/"))

#Calculate a table
with(out, count(combos))

                       x freq
1 HALOPERIDOL/QUETIAPINE    2
2 OLANZAPINE/HALOPERIDOL    1
3  OLANZAPINE/QUETIAPINE    3
4 OLANZAPINE/RISPERIDONE    4

【讨论】:

  • 这很有帮助,正是我想要的。谢谢
【解决方案2】:

只是为了好玩,一个基本的 R 解决方案(可以变成一个 oneliner :-)):

data.frame(table(apply(MultPsychMeds[,-1], 1, function(currow){
    wc<-which(currow==1)
    paste(colnames(MultPsychMeds)[wc+1], collapse="/")
})))

【讨论】:

    【解决方案3】:

    另一种方式可能是:

    subset(
        as.data.frame(
            with(MultPsychMeds, table(OLANZAPINE, HALOPERIDOL, QUETIAPINE, RISPERIDONE)),
            responseName="count"
        ),
        count>0
    )
    

    给了

       OLANZAPINE HALOPERIDOL QUETIAPINE RISPERIDONE count
    4           1           1          0           0     1
    6           1           0          1           0     3
    7           0           1          1           0     2
    10          1           0          0           1     4
    

    这不是您想要的确切方式,但它既快速又简单。


    plyr package中有简写:

    require(plyr)
    count(MultPsychMeds, c("OLANZAPINE", "HALOPERIDOL", "QUETIAPINE", "RISPERIDONE"))
    #   OLANZAPINE HALOPERIDOL QUETIAPINE RISPERIDONE freq
    # 1          0           1          1           0    2
    # 2          1           0          0           1    4
    # 3          1           0          1           0    3
    # 4          1           1          0           0    1
    

    【讨论】:

      猜你喜欢
      • 2018-03-05
      • 2013-05-01
      • 2017-09-04
      • 2016-05-31
      • 1970-01-01
      • 2012-07-28
      • 2023-04-02
      • 2021-10-27
      • 2016-04-08
      相关资源
      最近更新 更多