包括0个计数作为频率并创建新列

时间:2019-03-20 23:06:43

标签: r dplyr plyr

假设我有一个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

2 个答案:

答案 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)