【问题标题】:Conditionally, sum column based on two other column values有条件地,根据其他两个列值对列求和
【发布时间】:2021-03-14 12:48:05
【问题描述】:
RWZI_AWZI_name  municipality_name   RNA_value   weeknumber
Houtrust            's-Gravenhage         797   15
Houtrust             's-Gravenhage        245   16
Houtrust              's-Gravenhage      447    17
Houtrust              's-Gravenhage      2.91   36
Almelo-Vissedijk      Almelo             1.03   37
Almelo-Sumpel         Almelo              4.06   37
Houtrust             's-Gravenhage        3.94  37
Almelo-Vissedijk     Almelo              8.91   38
Almelo-Sumpel        Almelo             4.80    38
Houtrust            's-Gravenhage        4.35   38
Almelo-Vissedijk     Almelo              3.36   39
Almelo-Sumpel        Almelo               5.243 39
Houtrust            's-Gravenhage       8.432   39
    

仅当同一城市名称中同一周的 RWZ_AWZI_name 不同时,我才想对 RNA_value 列求和,否则不求和。

【问题讨论】:

  • 关于同一周和同一自治市,假设有两个条目。其中一个的 RWZI 名称是 A,另一个是 B。您想对哪个 RNA_value 求和?或者,如果存在不同的 RWZI 名称,您是否要对所有组求和?
  • @OnurDemir 我想将两个在同一个组中相加,是的,只要 RWZI 名称不同,因此例如它变成 A 的单行,它采用 B 的总 RNA 值
  • 请考虑投票并接受您的问题的答案。

标签: r dplyr


【解决方案1】:

我的逻辑: 看到对RNA_value 列求和的红色矩形,因为

  1. RWZ_AWZI_name 不同
  2. 在同一周
  3. 同一个城市名称
  4. 否则不求和。

编辑: 新信息:要实现新任务,我们可以使用cur_group_id() 分配组ID。然后在每组中只保留一行filter

# Old code:
# df1 <- df %>% 
#  group_by(weeknumber, municipality_name) %>% 
#  mutate(RNA_value = case_when(!duplicated(RWZI_AWZI_name) ~ sum(RNA_value),
#                              TRUE ~ RNA_value))
# New code:

df1 <- df %>% 
  group_by(weeknumber, municipality_name) %>% 
  mutate(group_id = cur_group_id()) %>% 
  mutate(RNA_value = case_when(!duplicated(RWZI_AWZI_name) ~ sum(RNA_value),
                               TRUE ~ RNA_value)) %>% 
  filter(row_number(group_id) == 1) %>% 
  select(municipality_name, RNA_value, weeknumber)

新图片:

【讨论】:

  • 谢谢,这正是我所需要的,但我想只保留每个求和行中的一个,因为最后我将删除 RWZI_AWZI_name
【解决方案2】:

这就是你要找的吗?


df <- data.frame(RWZI_AWZI_name = c("Houtrust", "Houtrust", "Houtrust", "Houtrust",
                              "Almelo-Vissedijk", "Almelo-Sumpel", "Houtrust",
                              "Almelo-Vissedijk", "Almelo-Sumpel", "Houtrust ",
                              "Almelo-Vissedijk", "Almelo-Sumpel", "Houtrust"),
           municipality_name = c("'s-Gravenhage", "'s-Gravenhage", "'s-Gravenhage",
                                 "'s-Gravenhage", "Almelo", "Almelo", "'s-Gravenhage",
                                 "Almelo", "Almelo", "'s-Gravenhage", "Almelo", "Almelo",
                                 "'s-Gravenhage"),
           RNA_value = c(797, 245, 447, 2.91, 1.03, 4.06, 3.94, 8.91, 4.80, 4.35, 3.36, 5.243, 8.432),
           weeknumber = c(15, 16, 17, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39)
           )


library(dplyr)


df %>% 
  group_by(weeknumber) %>%
  mutate(
    same = ifelse(municipality_name == lag(municipality_name), 1, 0),
    RNA_value = ifelse(is.na(same) | same == 1, sum(RNA_value[is.na(same) | same == 1]), RNA_value),
  ) %>% 
  group_by(municipality_name, weeknumber) %>% 
  filter(!duplicated(municipality_name)) %>% 
  select(-same)

#> # A tibble: 10 x 4
#> # Groups:   municipality_name, weeknumber [10]
#>    RWZI_AWZI_name     municipality_name RNA_value weeknumber
#>    <chr>              <chr>                 <dbl>      <dbl>
#>  1 "Houtrust"         's-Gravenhage        797            15
#>  2 "Houtrust"         's-Gravenhage        245            16
#>  3 "Houtrust"         's-Gravenhage        447            17
#>  4 "Houtrust"         's-Gravenhage          2.91         36
#>  5 "Almelo-Vissedijk" Almelo                 5.09         37
#>  6 "Houtrust"         's-Gravenhage          3.94         37
#>  7 "Almelo-Vissedijk" Almelo                13.7          38
#>  8 "Houtrust "        's-Gravenhage          4.35         38
#>  9 "Almelo-Vissedijk" Almelo                 8.60         39
#> 10 "Houtrust"         's-Gravenhage          8.43         39

由reprex package (v0.3.0) 于 2021 年 3 月 14 日创建

【讨论】:

  • 这不是解决方案,我想将同一周和同一自治市但具有不同 RWZI_name 的行的 RNA 值相加,例如,第 5 行变为单行,与 6 相结合RNA 值为 9.03.,第 7 行保持不变,因为它不在同一个城市
  • 好的,如果第 5 行与第 6 行组合成单行,RWZI_AWZI_name 中的值会是多少?
  • 我已经更新了我的解决方案。除了将行合并为一个之外,我相信总结是正确的,对@Oladapo?
  • RWZI_AWZI_name 的值将以第 5 行的值作为其值。新的解决方案仍然返回两行,但我只是希望它们都成一个。这可能吗?
  • @Oladapo - 我已经更新了我的解决方案,以便它只返回你问的一行。如果您最终想要删除 RWZI_AWZI_name,只需将选择更新为 select(-same, -RWZI_AWZI_name)
猜你喜欢
  • 2020-09-17
  • 2021-01-26
  • 2020-05-30
  • 2014-05-07
  • 2016-09-17
  • 2016-10-23
  • 1970-01-01
  • 2019-02-12
  • 2017-10-13
相关资源
最近更新 更多