我有一个数据框架(dfdat),包含两个分类变量,即位置和就业状态。
我想要生成一个数据框架,其中包含每个地点的就业状况比例。
mydf_wide (已实现的结果)几乎是我想要的。问题是,就业状况是一个有两个级别的变量,但是mydf_wide中有三行。我不明白为什么会这样,因为我希望看到类似mytable (预期结果)的东西。
任何帮助都将不胜感激。
起点(df):
dfdat <- data.frame(location=c("GA","GA","MA","OH","RI","GA","AZ","MA","OH","RI"),employmentstatus=c(1,2,1,2,1,1,1,2,1,1))预期成果(表):
mytable <- table(dfdat$employmentstatus,dfdat$location)
mytable <- round(100*(prop.table(mytable, 2)),1)取得的成果(df):
library(dplyr)
mydf <- dfdat %>%
group_by(location,employmentstatus) %>%
summarise (n = n()) %>%
mutate(freq = round((n / sum(n)*100),1))
library(tidyr)
mydf_wide <- spread(mydf, location, freq)
mydf_wide <- as.data.frame(mydf_wide)发布于 2017-11-19 13:56:51
我们需要用“位置”做第二个group_by才能得到sum。另外,可以使用count函数,而不是分组,然后创建'n‘函数
dfdat %>%
count(location, employmentstatus) %>%
group_by(location) %>%
mutate(n = round(100*n/sum(n), 2)) %>%
spread(location, n, fill = 0)
# A tibble: 2 x 6
# employmentstatus AZ GA MA OH RI
#* <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 1 100 66.67 50 50 100
#2 2 0 33.33 50 50 0如果我们使用OP的代码,那么删除'n‘列,然后执行spread
dfdat %>%
group_by(location,employmentstatus) %>%
summarise (n = n()) %>%
mutate(freq = round((n / sum(n)*100),1)) %>%
select(-n) %>%
spread(location, freq, fill =0)或者用round的输出更新'n‘列,然后更新spread。“n”中的一个额外列确保组合存在于数据集中。
https://stackoverflow.com/questions/47377640
复制相似问题