假设我有一个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
答案 0 :(得分:3)
以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
答案 1 :(得分:2)
这可以通过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
是否保留空组:< / p>
df %>% group_by(sample, drug) %>% tally %>% spread(drug, n, fill=0)