【问题标题】:Create new data frame from summed column values based on conditions根据条件从汇总的列值创建新数据框
【发布时间】:2020-11-20 19:36:19
【问题描述】:

我目前有一个如下所示的数据框:

census_2
# A tibble: 236,844 x 5
   STATE  RACE CENSUS2010POP POPESTIMATE2012
   <chr> <dbl>         <dbl>           <dbl>
 1 01        1         37991           37824
 2 01        1         38150           38597
 3 01        1         39738           37653
 4 01        1         39827           38113
 5 01        1         39353           39628
 6 01        1         39520           39821
 7 01        1         39813           39425
 8 01        2         39695           39636
 9 01        2         40012           39957
10 01        2         42073           39856
# … with 236,834 more rows, and 1 more variable:
#   POPESTIMATE2016 <dbl>

State 列将成为我想要普遍分组的内容。我将在比赛列中有多行代表相同的值。 CENSUS2010POP 列是对该特定州的特定种族群体的人口普查人口估计值。

所以,我最终想要做的是为整个州的每个种族群体人口估计值获取一列。例如,在原始数据集中,state = 1 & race = 1 指的是 State 1 中白人成分的人口。我想要的是总结该州对白人人口估计的观察,并将该估计变成一列。然后对于数据集中的第三列,我将对非白人在该特定州的人口估计值进行总和,假设它相当于上面原始数据集中的 RACE = 2。下面是一个简单的例子:

STATE  WHITE_CENSUS10POP                                  NONWHITE_CENSUS10POP
1      = summation(nrow where state == 1 & race == 1)     = summation(nrow where state == 1 & race == 2)
2.     = summation(nrow where state == 2 & race == 1)     = summation(nrow where state == 2 & race == 2)
3
4
5
6
...
50

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    有多种方法可以做到这一点。一个没有其他包依赖项的简单选项(假设只有两个'race')是通过基于'race'的值对'CENSUS2010POP'进行子集来对'STATE'和summarise进行两列分组并获取sum

    library(dplyr)
    df1 %>%
       group_by(STATE) %>%
       summarise(WHITE_CENSUS10POP = sum(CENSUS2010POP[race == 1]),
                 NONWHITE_CENUS10POP = sum(CENSUS2010POP[race == 2]), 
                .groups = 'drop')
    

    一个更通用的选择是让'CENSUS2010POP'的sum按'STATE'、'race'分组,然后使用pivot_wider将'long'格式数据转为'wide'

    library(tidyr)
    df1 %>%
       group_by(STATE, race) %>%
       summarise(value = sum(CENSUS2010POP), .groups = 'drop') %>%
       pivot_wider(names_from = race, values_from = value)
    

    【讨论】:

    • 这似乎将相同的数字相加。这是运行该代码后数据集的样子: # A tibble: 51 x 3 STATE WHITE_CENSUS10POP NONWHITE_CENSUS10POP 1 01 774 3870 2 02 774 3870 3 04 774 3870 4 05 774 3870 5 06 774 3870 # … 还有 51 行
    • @DamonC.Roberts 不同,因为race 不同。我使用了race == 1race == 2
    • 但这不只是将RACE 中的值相加吗?我希望使用 RACE 的值作为条件。
    • @DamonC.Roberts 是的,您的代码描述显示summation(nrow where state == 1 &amp; race == 1) 即行数
    • @DamonC.Roberts 根据您的描述存在混淆。我更新了代码。请检查这是否是您想要的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多