这个问题在这里已有答案:
假设我有一个data.frame
df = data.frame (
sample = c ( "s1","s2","s2"),
drug = c( "drug2" , "drug1", "drug2")
)
sample drug
1 s1 drug2
2 s2 drug1
3 s2 drug2
有没有简单的方法来创建一个计算所有药物实例的表格,包括零点击?
理想情况下,这样的事情。
samle drug1 drug2
1 s1 0 1
2 s2 1 1
基地R的老table
怎么样?
table(df)
# drug
#sample drug1 drug2
#s1 0 1
#s2 1 1
或者获得matrix
输出
as.data.frame.matrix(table(df))
# drug1 drug2
#s1 0 1
#s2 1 1
这可以用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)