今天早上我的日常活动一直在进行;咖啡,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>
希望这是一个比其他人容易的问题。 感谢您的帮助,并期待您的答复。请让我知道是否需要任何说明(或可复制的示例)。
答案 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