【问题标题】:Sum values according to specific condition in R根据R中的特定条件对值求和
【发布时间】:2019-02-04 15:50:48
【问题描述】:

我的 df 结构如下:

 Ateco. Numb. Reg

   10    223   A
   11    332   A
   12    343   A
   10    223   B
   11    332   B
   12    343   B
   29    414   B
   30    434   B
   31    444   B
   32    464   B

我想获得另一个 df,其中 numb 是我选择的 Ateco 值的总和。

 Ateco.     Numb.  Reg

10_11_12    898     A
10_11_12    898     B      
   29       414     B
   30       434     B
   31       444     B
   32       464     B

我该怎么办?

【问题讨论】:

  • 尝试aggregate(Ateco. ~ ., df, FUN = paste, collapse="_") 或使用dplyr df %>% group_by(Numb., Reg) %>% summarie(Ateco. = paste(Ateco., collapse="_"))data.table setDT(df)[, .(Ateco. = paste(Ateco., collapse="_")), by = .(Numb., Reg)]
  • 是的,但我必须声明哪些是我想要聚合的 Ateco 值
  • 在您的示例中,10、11、12 是唯一的值,因此应该会自动粘贴
  • 你是对的。我做了一些改变
  • 是否还有其他条件可以指定一组中的 10:12?

标签: r sum aggregate


【解决方案1】:

根据更新后的输入示例,按“Reg”分组以及“Ateco.”中存在的值 10 到 12,获取“Numb.”的sumpaste 'Ateco'、元素、ungroup 并在需要时删除'grp'

library(tidyverse)
df %>% 
   group_by(Reg, grp = Ateco. %in%  10:12) %>% 
   summarise(Numb. = sum(Numb.), 
            Ateco. = paste(Ateco., collapse="_")) %>%
   ungroup %>%
   select(-grp)
# A tibble: 3 x 3
#  Reg   Numb. Ateco.  
#  <chr> <int> <chr>   
#1 A       898 10_11_12
#2 B       414 29      
#3 B       898 10_11_12

如果我们假设 'grp' 是基于两个 'Reg' 元素中出现的 'Ateco' 值创建的

df %>% 
    group_by(Ateco.) %>%
    group_by(grp = n_distinct(Reg) > 1, Reg) %>% 
    summarise(Numb. = sum(Numb.),
             Ateco. = paste(Ateco., collapse="_")) %>%
    ungroup %>%
    select(-grp)

更新

基于新数据集

df2 %>% 
    group_by(Ateco. = case_when(Ateco. %in% 10:12 ~ '10_11_12', 
                   TRUE ~ as.character(Ateco.)), Reg) %>% 
    summarise(Numb. = sum(Numb.))
# A tibble: 6 x 3
# Groups:   Ateco. [?]
#  Ateco.   Reg   Numb.
#  <chr>    <chr> <int>
#1 10_11_12 A       898
#2 10_11_12 B       898
#3 29       B       414
#4 30       B       434
#5 31       B       444
#6 32       B       464

数据

df <- structure(list(Ateco. = c(10L, 11L, 12L, 10L, 11L, 12L, 29L), 
Numb. = c(223L, 332L, 343L, 223L, 332L, 343L, 414L), Reg = c("A", 
"A", "A", "B", "B", "B", "B")), class = "data.frame", row.names = c(NA, 
 -7L))

df2 <- structure(list(Ateco. = c(10L, 11L, 12L, 10L, 11L, 12L, 29L, 
 30L, 31L, 32L), Numb. = c(223L, 332L, 343L, 223L, 332L, 343L, 
 414L, 434L, 444L, 464L), Reg = c("A", "A", "A", "B", "B", "B", 
 "B", "B", "B", "B")), class = "data.frame", row.names = c(NA, 
 -10L))

【讨论】:

  • 如果有多个不同于 10、11、12 的值,这会给我带来问题。我更新输入 df
  • 它聚合了我想要聚合的值,但也聚合了所有其他值。
  • @Silvia 更新了帖子
猜你喜欢
  • 2022-11-30
  • 2023-01-16
  • 2023-01-26
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
相关资源
最近更新 更多