我有一个数据集,其中每一行对应于一个样本,该样本被测试是否存在特定药物(一个样本可以有多个药物)。我正在努力寻找最常见的药物组合,我想知道是否有更好的方法来做到这一点。这是我的数据集的一个例子:
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表示否。
为了得到组合的数量,我做了以下工作:
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种药物做了它,我结束了一个巨大的字符串,我需要翻译回来。
有没有更有效的方法来做到这一点?谢谢!
发布于 2020-03-17 16:44:16
使用dplyr,您可以:
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
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发布于 2020-03-17 17:36:34
附加选项
df %>%
pivot_longer(-id) %>%
filter(value != 0) %>%
group_by(id) %>%
summarise(name = str_c(name, collapse = ", ")) %>%
group_by(name) %>%
count() %>%
arrange(-n)https://stackoverflow.com/questions/60726630
复制相似问题