首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用dplyr和tidyr从长到宽格式的意外行

使用dplyr和tidyr从长到宽格式的意外行
EN

Stack Overflow用户
提问于 2017-11-19 13:54:29
回答 1查看 44关注 0票数 1

我有一个数据框架(dfdat),包含两个分类变量,即位置和就业状态。

我想要生成一个数据框架,其中包含每个地点的就业状况比例。

mydf_wide (已实现的结果)几乎是我想要的。问题是,就业状况是一个有两个级别的变量,但是mydf_wide中有三行。我不明白为什么会这样,因为我希望看到类似mytable (预期结果)的东西。

任何帮助都将不胜感激。

起点(df):

代码语言:javascript
复制
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))

预期成果(表):

代码语言:javascript
复制
mytable <- table(dfdat$employmentstatus,dfdat$location)
mytable <- round(100*(prop.table(mytable, 2)),1)

取得的成果(df):

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-19 13:56:51

我们需要用“位置”做第二个group_by才能得到sum。另外,可以使用count函数,而不是分组,然后创建'n‘函数

代码语言:javascript
复制
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

代码语言:javascript
复制
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”中的一个额外列确保组合存在于数据集中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47377640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档