我有一个接受过一次或多次外科手术的患者的数据框架,我想按手术类型对他们进行分组,以便分析结果。这些过程用数字(1-5)表示。为了避免必须在数据框架中为每种手术类型创建一个新列来标识患者是否执行了该独特的手术,我基本上是在寻找一种方法来对列表中的每个唯一值进行聚合分组和汇总。
一个典型的df看起来像这样…
id <- c(1,2,3,4,5,6,7,8,9,10)
procedures <- list(2, 3, c(1,5), 1, c(3,4), c(1,3), 5, 2, c(1,2,5), 4)
df <- as.data.frame(cbind(id, procedures))
假设我想计算每种手术的患者数量。下面的代码显然会将每个惟一的列表作为一个单独的对象来计算。
df %>%
group_by(procedures) %>%
summarise(n = n())
我想要完成的是每个唯一过程在列表的列表中出现的次数。下面是一个过度简化的例子。
df %>%
group_by(unique(procedures)) %>%
summarise(n = n())
我们可以把list
列的unnest
用在group_by
中
library(dplyr)
library(tidyr)
df %>%
unnest(everything()) %>%
group_by(procedures) %>%
summarise(n = n())
我们可以使用separate_rows
和count
:
library(dplyr)
library(tidyr)
df %>%
separate_rows("procedures", sep = " ,") %>%
count(procedures)
procedures n
<dbl> <int>
1 1 4
2 2 3
3 3 3
4 4 2
5 5 3