首页 > 解决方案 > pivot_wider 单行

问题描述

今天早上是我的例行公事。咖啡、纽约时报和基于 R 的问题/学习。一直在写一篇博客文章,并利用该tidycensus软件包,并开发了一个有趣的问题。

如何pivot_wider 表中的单行?或者如何根据单行的条件创建比例?

我正在尝试根据总人口创建一定比例的白人和黑人人口数据。初始表如下所示...

Ohio_population_acs5 %>% 
  group_by(ID) %>%
  summarise(Total = sum(estimate))

# A tibble: 3 x 2
  ID                            Total
  <chr>                       <dbl>
1 Black or African American 1336133
2 Total                     8204988
3 White                     6283529

使用这张桌子,我最初的想法是pivot_wider()桌子,then pivot_longer()看起来像这样的结果......

Ohio_population_acs5 %>% 
  group_by(ID) %>%
  summarise(Total = sum(estimate)) %>% 
  pivot_wider(names_from = ID, values_from = Total) %>% 
  pivot_longer(cols = c(`Black or African American`,`White`), names_to = "ID", values_to = "value")

# A tibble: 2 x 3
    Total ID                          value
    <dbl> <chr>                       <dbl>
1 8204988 Black or African American 1336133
2 8204988 White                     6283529

然后在 value 列和 Total 之间创建一个比例比...

Ohio_population_acs5 %>% 
  group_by(ID) %>%
  summarise(Total = sum(estimate)) %>% 
  pivot_wider(names_from = ID, values_from = Total) %>% 
  pivot_longer(cols = c(`Black or African American`,`White`), names_to = "ID", values_to = "value") %>%
  group_by(ID) %>% 
  mutate(Prop_pop = value/Total)

# A tibble: 2 x 4
# Groups:   ID [2]
    Total ID                          value Prop_pop
    <dbl> <chr>                       <dbl>    <dbl>
1 8204988 Black or African American 1336133    0.163
2 8204988 White                     6283529    0.766

但是,选择pivot_wider()而不是整列,然后填充值要方便得多。也许有一种更简单的方法来处理这个过程,但似乎可能有一个函数或过程可以将pivot_wider-组合pivot_longer成一个操作,特别是提取单个行值。

希望这是一个比其他问题更容易的问题。感谢您对此的帮助,并期待回复。如果需要任何澄清(或可重复的示例),请告诉我。

标签: rtidyr

解决方案


您无需任何旋转即可获得该输出

library(dplyr)

df %>% 
  rename_at('Total', ~'value') %>% 
  transmute(Total = value[ID == 'Total'],
            ID,
            value,
            Prop = value/Total) %>% 
  filter(ID != 'Total')

#     Total                        ID   value      Prop
# 1 8204988 Black or African American 1336133 0.1628440
# 2 8204988                     White 6283529 0.7658182

推荐阅读