使用传播和分离到结构表

时间:2017-07-15 22:15:33

标签: r format frequency tidyr

我有一个类似下面的表格想获得一些频率统计数据,我使用下面的代码完成了。

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,'%)'))

换句话说,考虑到n中的Total群,我可以按更高2016的单位订购结果吗?

2 个答案:

答案 0 :(得分:2)

你也可以使用tidyr

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

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

答案 1 :(得分:1)

使用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