gpt4 book ai didi

r - 根据条件汇总行

转载 作者:行者123 更新时间:2023-12-04 10:11:25 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com