r - 根据条件汇总行

标签 r dplyr

创建示例数据集以重现问题

library(dplyr)
x <- c('MS','Google','MS','FB','Amazon','Google','IBM','IBM','IBM','MS')
item <- as.data.frame(x,stringsAsFactors = F)
data <- item %>% group_by(x) %>% summarise(n = n())

# A tibble: 5 x 2
  x          n
  <chr>  <int>
1 Amazon     1
2 FB         1
3 Google     2
4 IBM        3
5 MS         3

现在我打算创建一个数据集,其中所有小于 2 的“n”计数都应汇总在名为“其他”的行中,同时它还对 n 计数求和,如

x          n
  <chr>  <int>
1 Other      2
2 Google     2
3 IBM        3
4 MS         3

我可以通过下面提到的代码来实现它,但我确信这不是一个好的方法,请建议我是否可以直接通过 dplyr 查询来做同样的事情

data$x[data$n < 2]= 'Other'
data <- aggregate(n~x, data, FUN = sum)

最佳答案

这是一个来自 dplyr 的想法,

library(dplyr)

data %>% 
 mutate(grp = cumsum(c(1, diff(n < 2) != 0)), 
        grp = replace(grp, n >=2, grp[n >= 2] + row_number()[n >= 2])) %>%
 group_by(grp) %>% 
 summarise(x = toString(x), n = sum(n)) %>% 
 ungroup() %>% 
 select(-grp)

这给出了,

# A tibble: 4 x 2
  x              n
  <chr>      <int>
1 Amazon, FB     2
2 Google         2
3 IBM            3
4 MS             3

注意:如果您真的想使用Other,那么在管道的末尾添加以下内容,

... %>% mutate(x = replace(x, grepl(',', x), 'Other'))

要“解密”分组的 cumsum 部分,让我们将其分解。

我们想要创建组中所有值都小于 2 的组。但是,不可避免地,我们也会为大于(或等于)2 的值创建组。为了避免汇总这些组,我们通过添加来替换它们他们的增量值(value)。这将确保值大于 2 的组将只有一个元素,从而确保它们也不会在最后被汇总。 获取组的技巧是创建一个值小于 2 的逻辑向量,并在它从 TRUE 变为 FALSE 时求差值(因此 ...!= 0 部分)。由于 diff 将删除一个值,我们通过 c(1, diff(...)) 手动添加它。请注意,您可以输入 TRUE 而不是 1。 cumsum 然后创建组。为了避免汇总值 > 2 的组,我们通过将它们的 row_number 添加到它们来替换它们。为什么是行号?因为它会增加,从而使所有组都独一无二。

x <- c(1, 1, 3, 4, 2, 1, 1, 1, 5)

x < 2
#[1]  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE
diff(x < 2) != 0
#[1] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE
cumsum(c(1, diff(x < 2) != 0))
#[1] 1 1 2 2 2 3 3 3 4

关于r - 根据条件汇总行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49208227/

相关文章:

r - 将 chr "00:00:00"转换为日期时间 "00:00:00"

在 R 中重新排序和 reshape 列

r - 如何将一列示例 ID 映射到其各自的文件名

r - 在自定义 dplyr 函数中更改结果变量的名称

r - 手动计算ACF

r - 将背景颜色设置为 corrplot 中数据的强度

r - 按两个数字对列名称进行排序

r - "group_by->summarise->mean()"花费的时间比预期的要长

r - 从文本字符串中获取字符串的唯一计数

r - 如何以编程方式提供要通过 dplyr 和 filter_ 应用的过滤器列表