ivot_wider单行

时间:2020-06-03 12:58:06

标签: r tidyr

今天早上我的日常活动一直在进行;咖啡,NYT和基于R的问题/学习。一直在撰写博客文章,并使用tidycensus包,并提出了一个有趣的问题。

如何在数据透视表中旋转单个行? 要么 如何根据单行的条件创建比例?

我试图基于总人口创建一定比例的白人和黑人人口数据。初始表如下所示:

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

然后在“值”列和“总计”之间创建比例。

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组合为单个操作,特别是提取单个行值的函数或过程。 / p>

希望这是一个比其他人容易的问题。 感谢您的帮助,并期待您的答复。请让我知道是否需要任何说明(或可复制的示例)。

1 个答案:

答案 0 :(得分:3)

您无需任何操作即可获得该输出

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