首页 > 解决方案 > 使用 R 中同一列的另一行值对特定行值执行计算

问题描述

我有一张如下表( dput 在最后)

# A tibble: 912 x 7
   group_id class_id  year variable  value demo_names total_population
      <dbl>    <dbl> <dbl> <chr>     <chr> <chr>                 <dbl>
 1      449        1  2017 numerator 64    numerator              1819
 2      449        1  2018 numerator 39    numerator              1531
 3      449        1  2019 numerator 41    numerator              1710
 4      449        1  2020 numerator 51    numerator              2075
 5      450        1  2017 numerator 66    numerator              1819
 6      450        1  2018 numerator 54    numerator              1531
 7      450        1  2019 numerator 58    numerator              1710
 8      450        1  2020 numerator 66    numerator              2075
 9      451        1  2017 numerator 37    numerator              1819
10      451        1  2018 numerator 39    numerator              1531

对于各个年份和变量名称,我想计算 2 个百分比列,如下所示。在哪里,我使用特定的行值来获取百分比。

该列demo_names有分子、分母、sex_male、sex_female、age_18-34、age_35-54、age_55。这是从列variable中派生的,该列告诉我们列值是否具有相应年龄、性别的分子或分母。因此,计算百分比将使用分子和分母的相应值。

per_col_1 = round(sex_numerator_male/sex_denominator_male) *100,2)
            round(sex_numerator_female/sex_denominator_female) *100,2) 
            round(numerator/denominator_2) *100,2) 
            round(age_numerator_18.34/age_denominator_18.34)*100,2) 
            round(age_numerator_35.54/age_denominator_35.54)*100,2) 
            round(age_numerator_55/age_denominator_55)*100,2) 
            

per_col_2 = round(sex_numerator_male/numerator) *100,2)
            round(sex_numerator_female/numerator) *100,2) 
            round(age_numerator_18.34/numerator)*100,2) 
            round(age_numerator_35.54/numerator)*100,2) 
            round(age_numerator_55/numerator)*100,2) 

       

- - 数据

dput(ds)
structure(list(group_id = c(449, 449, 449, 449, 461, 461, 461, 
461, 449, 449, 449, 449, 461, 461, 461, 461, 449, 449, 449, 449, 
461, 461, 461, 461, 449, 449, 449, 449, 461, 461, 461, 461, 449, 
449, 449, 449, 461, 461, 461, 461, 449, 449, 449, 449, 461, 461, 
461, 461, 449, 449, 449, 449, 461, 461, 461, 461, 449, 449, 449, 
449, 461, 461, 461, 461, 449, 449, 449, 449, 461, 461, 461, 461, 
449, 449, 449, 449, 461, 461, 461, 461, 449, 449, 449, 449, 461, 
461, 461, 461, 449, 449, 449, 449, 461, 461, 461, 461), class_id = c(1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), year = c(2017, 2018, 2019, 
2020, 2017, 2018, 2019, 2020, 2017, 2018, 2019, 2020, 2017, 2018, 
2019, 2020, 2017, 2018, 2019, 2020, 2017, 2018, 2019, 2020, 2017, 
2018, 2019, 2020, 2017, 2018, 2019, 2020, 2017, 2018, 2019, 2020, 
2017, 2018, 2019, 2020, 2017, 2018, 2019, 2020, 2017, 2018, 2019, 
2020, 2017, 2018, 2019, 2020, 2017, 2018, 2019, 2020, 2017, 2018, 
2019, 2020, 2017, 2018, 2019, 2020, 2017, 2018, 2019, 2020, 2017, 
2018, 2019, 2020, 2017, 2018, 2019, 2020, 2017, 2018, 2019, 2020, 
2017, 2018, 2019, 2020, 2017, 2018, 2019, 2020, 2017, 2018, 2019, 
2020, 2017, 2018, 2019, 2020), variable = c("numerator", "numerator", 
"numerator", "numerator", "numerator", "numerator", "numerator", 
"numerator", "denominator_2", "denominator_2", "denominator_2", 
"denominator_2", "denominator_2", "denominator_2", "denominator_2", 
"denominator_2", "sex_numerator_male", "sex_numerator_male", 
"sex_numerator_male", "sex_numerator_male", "sex_numerator_male", 
"sex_numerator_male", "sex_numerator_male", "sex_numerator_male", 
"sex_numerator_female", "sex_numerator_female", "sex_numerator_female", 
"sex_numerator_female", "sex_numerator_female", "sex_numerator_female", 
"sex_numerator_female", "sex_numerator_female", "sex_denominator_male", 
"sex_denominator_male", "sex_denominator_male", "sex_denominator_male", 
"sex_denominator_male", "sex_denominator_male", "sex_denominator_male", 
"sex_denominator_male", "sex_denominator_female", "sex_denominator_female", 
"sex_denominator_female", "sex_denominator_female", "sex_denominator_female", 
"sex_denominator_female", "sex_denominator_female", "sex_denominator_female", 
"age_numerator_18.34", "age_numerator_18.34", "age_numerator_18.34", 
"age_numerator_18.34", "age_numerator_18.34", "age_numerator_18.34", 
"age_numerator_18.34", "age_numerator_18.34", "age_numerator_35.54", 
"age_numerator_35.54", "age_numerator_35.54", "age_numerator_35.54", 
"age_numerator_35.54", "age_numerator_35.54", "age_numerator_35.54", 
"age_numerator_35.54", "age_numerator_55", "age_numerator_55", 
"age_numerator_55", "age_numerator_55", "age_numerator_55", "age_numerator_55", 
"age_numerator_55", "age_numerator_55", "age_denominator_18.34", 
"age_denominator_18.34", "age_denominator_18.34", "age_denominator_18.34", 
"age_denominator_18.34", "age_denominator_18.34", "age_denominator_18.34", 
"age_denominator_18.34", "age_denominator_35.54", "age_denominator_35.54", 
"age_denominator_35.54", "age_denominator_35.54", "age_denominator_35.54", 
"age_denominator_35.54", "age_denominator_35.54", "age_denominator_35.54", 
"age_denominator_55", "age_denominator_55", "age_denominator_55", 
"age_denominator_55", "age_denominator_55", "age_denominator_55", 
"age_denominator_55", "age_denominator_55"), value = c("64", 
"39", "41", "51", "149", "158", "203", "236", "79226", "79033", 
"78891", "78891", "331407", "330987", "330073", "330073", "54", 
"39", "40", "46", "109", "114", "147", "169", "42", "#VALUE!", 
"33", "37", "72", "76", "88", "99", "39811", "39631", "39558", 
"39558", "157777", "157834", "157018", "157018", "39447", "39434", 
"39365", "39365", "173662", "173185", "173087", "173087", "48", 
"34", "37", "41", "70", "86", "85", "108", "42", "36", "34", 
"41", "87", "87", "116", "129", "38", "33", "34", "33", "56", 
"49", "66", "63", "22723", "22663", "22754", "22754", "99735", 
"99362", "98694", "98694", "24668", "24266", "23797", "23797", 
"103850", "102584", "101293", "101293", "31899", "32168", "32404", 
"32404", "127886", "129105", "130150", "130150"), demo_names = c("numerator", 
"numerator", "numerator", "numerator", "numerator", "numerator", 
"numerator", "numerator", "denominator_2", "denominator_2", "denominator_2", 
"denominator_2", "denominator_2", "denominator_2", "denominator_2", 
"denominator_2", "sex_male", "sex_male", "sex_male", "sex_male", 
"sex_male", "sex_male", "sex_male", "sex_male", "sex_female", 
"sex_female", "sex_female", "sex_female", "sex_female", "sex_female", 
"sex_female", "sex_female", "sex_male", "sex_male", "sex_male", 
"sex_male", "sex_male", "sex_male", "sex_male", "sex_male", "sex_female", 
"sex_female", "sex_female", "sex_female", "sex_female", "sex_female", 
"sex_female", "sex_female", "age_18-34", "age_18-34", "age_18-34", 
"age_18-34", "age_18-34", "age_18-34", "age_18-34", "age_18-34", 
"age_35-54", "age_35-54", "age_35-54", "age_35-54", "age_35-54", 
"age_35-54", "age_35-54", "age_35-54", "age_55", "age_55", "age_55", 
"age_55", "age_55", "age_55", "age_55", "age_55", "age_18-34", 
"age_18-34", "age_18-34", "age_18-34", "age_18-34", "age_18-34", 
"age_18-34", "age_18-34", "age_35-54", "age_35-54", "age_35-54", 
"age_35-54", "age_35-54", "age_35-54", "age_35-54", "age_35-54", 
"age_55", "age_55", "age_55", "age_55", "age_55", "age_55", "age_55", 
"age_55"), total_population = c(1819, 1531, 1710, 2075, 1819, 
1531, 1710, 2075, 3965491, 3974411, 3981322, 3981322, 3965491, 
3974411, 3981322, 3981322, 1226, 1034, NA, 1441, 1226, 1034, 
NA, 1441, NA, NA, NA, NA, NA, NA, NA, NA, 1900686, 1904909, 1908231, 
1908231, 1900686, 1904909, 1908231, 1908231, 2064805, 2069502, 
2073091, 2073091, 2064805, 2069502, 2073091, 2073091, NA, NA, 
NA, 687, NA, NA, NA, 687, NA, 724, NA, 996, NA, 724, NA, 996, 
NA, NA, NA, NA, NA, NA, NA, NA, 1234974, 1235975, 1237334, 1237334, 
1234974, 1235975, 1237334, 1237334, 1251344, 1240729, 1228864, 
1228864, 1251344, 1240729, 1228864, 1228864, 1479173, 1497707, 
1515124, 1515124, 1479173, 1497707, 1515124, 1515124)), spec = structure(list(
    cols = list(group_id = structure(list(), class = c("collector_double", 
    "collector")), class_id = structure(list(), class = c("collector_double", 
    "collector")), year = structure(list(), class = c("collector_double", 
    "collector")), variable = structure(list(), class = c("collector_character", 
    "collector")), value = structure(list(), class = c("collector_character", 
    "collector")), demo_names = structure(list(), class = c("collector_character", 
    "collector")), total_population = structure(list(), class = c("collector_double", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), delim = ","), class = "col_spec"), problems = <pointer: 0x000001e3e6505390>, row.names = c(NA, 
-96L), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"
))

标签: rdplyrtidyversetidyr

解决方案


推荐阅读