这可以通过dplyr 完成。 dplyr 的最新版本(撰写本文时为 0.8.0.1)有一个 .drop=FALSE 选项,用于对保留空组的变量进行分组。为了保留空组,分组列必须都是因子类:
library(dplyr)
library(tidyr)
df %>%
# Convert grouping columns to factor if they aren't already
mutate_if(is.character, factor) %>%
group_by(sample, drug, .drop=FALSE) %>%
tally %>%
spread(drug, n)
sample drug1 drug2
1 s1 0 1
2 s2 1 1
或者,要将输出保持为“长”格式以供进一步处理,请在 spread 之前停止:
df %>%
mutate_if(is.character, factor) %>%
group_by(sample, drug, .drop=FALSE) %>%
tally
sample drug n
1 s1 drug1 0
2 s1 drug2 1
3 s2 drug1 1
4 s2 drug2 1
以上代码将确保保留所有空组组合。但是,如果您要将数据分散到“宽”格式的表中,那么我们可以处理 spread 步骤中缺少的组,而不必担心 group_by 是否保留空组:
df %>%
group_by(sample, drug) %>%
tally %>%
spread(drug, n, fill=0)