包括0计数作为频率并创建新列[重复]

问题描述 投票:-3回答:2

这个问题在这里已有答案:

假设我有一个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 dplyr plyr
2个回答
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

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是否保留空组:

df %>% 
  group_by(sample, drug) %>% 
  tally %>% 
  spread(drug, n, fill=0)
© www.soinside.com 2019 - 2024. All rights reserved.