【问题标题】:Using spread and separate to structure table使用spread和separate来构造表
【发布时间】:2017-07-15 22:15:33
【问题描述】:

我有一张像下面这样的表格,想获得一些频率统计信息,我已经使用下面的代码完成了。

df <- data.frame(cbind(sample(c('Controle','Tratado'),
                              10, replace = T),
                       sample(c(2012,2016),10,T),
                       c('A','B','A','B','C','D','D','A','F','A')))

colnames(df) <- c('Group','Year','Unit')

table <- df %>%
  group_by(Year,Group) %>%
  count(Unit) %>%
  mutate(prop = prop.table(n)) %>%
  bind_rows(df %>%                                               
              mutate(Group ="Total") %>%                         
              group_by(Year, Group) %>%                         
              count(Unit)) %>%
  mutate(prop = prop.table(n))

但是,是否有一些 tidyr 函数的组合可以帮助我以某种方式重塑表格,使 Unit 观察结果位于行上,并且 Group/Year 的每个组合都有一个列?

另外,由于单位可能不存在于两个组和/或年份,如果是这种情况,我想将单元格留空。

非常感谢。


编辑: 有没有办法让决赛桌按照 2016 年 n 最大的单位对行进行排序?最后我只会使用安排。但是,我也想粘贴 nprop 列,这会使结果不再是数字。

df <- data.frame(cbind(sample(c('Controle','Tratado'),
                              10, replace = T),
                       sample(c(2012,2016),10,T),
                       c('A','B','A','B','C','D','D','A','F','A')))

colnames(df) <- c('Group','Year','Unit')

table <- df %>%
  group_by(Year,Group) %>%
  count(Unit) %>%
  mutate(prop = prop.table(n)) %>%
  bind_rows(df %>%                                               
              mutate(Group ="Total") %>%                         
              group_by(Year, Group) %>%                         
              count(Unit)) %>%
  mutate(prop = prop.table(n))

is.num <- sapply(table, is.numeric)
table[is.num] <- lapply(table[is.num], round, 4)
table <- table %>%
  mutate(Frequency = paste0(n,' (', 100*prop,'%)'))

换句话说,考虑到2016 中的Total 组,我可以按具有更大n 的单位对结果进行排序吗?

【问题讨论】:

  • library(reshape2); dcast(table, Unit ~ Year + Group )?
  • 我认为它可以胜任!谢谢
  • ps。与您的问题无关,但不要使用data.frame(cbind(...,只需使用data.frame
  • 类似地,table 是一个内置函数。不建议用您自己的类似名称的对象覆盖此类函数。

标签: r format frequency tidyr


【解决方案1】:

你也可以使用 tidyr

> table2 <- table%>%gather(type,measurement, -Year,-Group,-Unit)%>%
                    unite(year_group,Year:Group,sep = ":")%>%
                    spread(year_group,measurement)

这也保留了测量的类型,即count(n)和prop

【讨论】:

    【解决方案2】:

    使用reshape2 快速简单:

    library(reshape2); 
    dcast(table, Unit ~ Year + Group )
    

    这将使用剩余的列之一来填充值。保留两者:

    table.m <- melt(table, id.vars = c("Year", "Group", "Unit"))
    dcast(table.m, Unit + variable ~ Year + Group )
    

    产生:

     Unit variable 2012_Controle 2012_Total 2012_Tratado 2016_Controle 2016_Total 2016_Tratado
    1     A        n     1.0000000  3.0000000    2.0000000            NA       1.00          1.0
    2     A     prop     0.3333333  0.5000000    0.6666667            NA       0.25          0.5
    3     B        n     1.0000000  2.0000000    1.0000000            NA         NA           NA
    4     B     prop     0.3333333  0.3333333    0.3333333            NA         NA           NA
    5     C        n     1.0000000  1.0000000           NA            NA         NA           NA
    6     C     prop     0.3333333  0.1666667           NA            NA         NA           NA
    7     D        n            NA         NA           NA           1.0       2.00          1.0
    8     D     prop            NA         NA           NA           0.5       0.50          0.5
    9     F        n            NA         NA           NA           1.0       1.00           NA
    10    F     prop            NA         NA           NA           0.5       0.25           NA
    

    【讨论】:

      猜你喜欢
      • 2019-03-31
      • 1970-01-01
      • 2021-12-15
      • 2021-10-17
      • 2021-09-18
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多