首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找组合数

查找组合数
EN

Stack Overflow用户
提问于 2020-03-17 16:40:13
回答 2查看 34关注 0票数 1

我有一个数据集,其中每一行对应于一个样本,该样本被测试是否存在特定药物(一个样本可以有多个药物)。我正在努力寻找最常见的药物组合,我想知道是否有更好的方法来做到这一点。这是我的数据集的一个例子:

代码语言:javascript
复制
    id = c(id1,id2,id3,id4,id5,id6,id7,id8)
    d1 = c(1,1,0,1,0,1,0,1)
    d2 = c(0,0,1,0,1,1,1,0)
    d3 = c(1,0,1,1,0,1,0,1)

    df = tibble(id, d1, d2, d3)

id对应于样本的id,其他列是每个样本被测试的药物(在原始数据集中,我有42种药物/列)。1表示是,0表示否。

为了得到组合的数量,我做了以下工作:

代码语言:javascript
复制
df %>% unite("tot", d1:d3, sep = "-", remove = F) %>%
  group_by(tot) %>% summarise(n = n())

# A tibble: 5 x 2
  tot       n
  <chr> <int>
1 0-1-0     2
2 0-1-1     1
3 1-0-0     1
4 1-0-1     3
5 1-1-1     1

好的,现在我知道组合1-0-1 (d1 + d3)是最常见的。这是相对简单的,考虑到在这个例子中我只有3种药物。问题是,当我为这42种药物做了它,我结束了一个巨大的字符串,我需要翻译回来。

有没有更有效的方法来做到这一点?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-17 16:44:16

使用dplyr,您可以:

代码语言:javascript
复制
df %>%
 group_by_at(vars(-id)) %>%
 count()

     d1    d2    d3     n
  <dbl> <dbl> <dbl> <int>
1     0     1     0     2
2     0     1     1     1
3     1     0     0     1
4     1     0     1     3
5     1     1     1     1

如果您希望列的名称与n(此处两个)最常见的组合中的列同名,则添加tidyr

代码语言:javascript
复制
df %>%
 group_by_at(vars(-id)) %>%
 count() %>%
 ungroup() %>%
 top_n(2, wt = n) %>%
 rowid_to_column() %>%
 pivot_longer(-c(rowid, n)) %>%
 group_by(rowid, n) %>%
 summarise(name = paste(name[value == 1], collapse = ", "))

  rowid     n name  
  <int> <int> <chr> 
1     1     2 d2    
2     2     3 d1, d3
票数 3
EN

Stack Overflow用户

发布于 2020-03-17 17:36:34

附加选项

代码语言:javascript
复制
df %>% 
  pivot_longer(-id) %>% 
  filter(value != 0) %>% 
  group_by(id) %>% 
  summarise(name = str_c(name, collapse = ", ")) %>% 
  group_by(name) %>% 
  count() %>% 
  arrange(-n)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60726630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档