将值大于 n 的行汇总为 R 中的一个

Sum rows with value larger than n into one in R

我有一个数据框:

df <- data.frame(count=c(0,1,2,3,4,5,6), value=c(100,50,60,70,2,6,8))

  count value
1     0   100
2     1    50
3     2    60
4     3    70
5     4     2
6     5     6
7     6     8

如何将大于 "n" 的值加到一行中?因此,例如,如果我选择 n = 3 那么我想要:

  count value
1     0   100
2     1    50
3     2    60
4     3    70
5    >3    16

将计数强制分解为 3 以上的所有因素并折叠成 ">3"。然后 aggregate 按计数计算的值。

df$count <- factor(ifelse(df$count > 3, ">3", df$count), levels = c(1:3, ">3"))
aggregate(value ~ count, df, sum)
#  count value
#1     0   100
#2     1    50
#3     2    60
#4     3    70
#5    >3    16

R 4.1.0 或以上。

从 R 4.1.0 开始,有一个新的管道运算符和一个新的 lambda,如果要保持列 count 不变,这意味着,如果转换只是临时的,则可以使用它们.

df |>
  within(count <- factor(ifelse(count > 3, ">3", count), levels = c(1:3, ">3"))) |>
  (\(x)aggregate(value ~ count, x, sum))()
#  count value
#1     0   100
#2     1    50
#3     2    60
#4     3    70
#5    >3    16

我们可以使用

library(dplyr)
 df %>% 
    group_by(count = case_when(count >3 ~ '>3', 
     TRUE ~ as.character(count))) %>% 
    summarise(value = sum(value), .groups = 'drop')

另一个基本 R 选项使用 aggregate

transform(
  aggregate(
    . ~ count,
    transform(df, count = replace(count, count > 3, Inf)),
    sum
  ),
  count = replace(count, is.infinite(count), ">3")
)

给予

  count value
1     0   100
2     1    50
3     2    60
4     3    70
5    >3    16

这是一个使用 replace 的 dplyr 解决方案。缺点是,如果 >3 应该是最后一行,则它必须是 arranged(否则它会非常简洁)。

library(dplyr)

df %>% 
  group_by(count = replace(count, count > 3, ">3")) %>% 
  summarise(value = sum(value)) %>% 
  arrange(count == ">3")
#> # A tibble: 5 x 2
#>   count value
#>   <chr> <dbl>
#> 1 0       100
#> 2 1        50
#> 3 2        60
#> 4 3        70
#> 5 >3       16

reprex package (v0.3.0)

于 2021-08-26 创建