R 根据条件汇总行
创建示例数据集以再现问题R 根据条件汇总行,r,dplyr,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
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
库(dplyr)
x这里是通过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)
要“解密”分组的cumsum
部分,让我们将其分解
我们希望创建组,其中该组中的所有值都小于2。然而,不可避免地,我们也为大于(或等于)2的值创建组。为了避免对这些组进行总结,我们通过增加它们的增量值来替换它们。这将确保值大于2的组中只有一个元素,从而确保不会在最后对其进行总结。
获取组的诀窍是创建一个值小于2的逻辑向量,并在它从TRUE变为FALSE(因此,..!=0
部分)时获取差异。由于diff
将删除一个值,因此我们通过c(1,diff(…)
手动添加它。请注意,可以将TRUE
替换为1。然后,cumsum
创建组。为了避免对值大于2的组进行汇总,我们通过将它们的行数添加到组中来替换它们。为什么是排号?因为它会增加,从而使所有组都是唯一的
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
x使用bind_rows
和filter
可以实现另一个选项,如下所示:
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())
data %>% {
bind_rows(filter(., n >= 2),
filter(., n < 2) %>% summarise(x = "Other", n = sum(n))
)
}
# x n
# <chr> <int>
#1 Google 2
#2 IBM 3
#3 MS 3
#4 Other 2
库(dplyr)
x%{
绑定行(筛选器(,n>=2),
过滤器(,n<2)%>%汇总(x=“其他”,n=总和(n))
)
}
#x n
#
#1谷歌2
#2 IBM 3
#3毫秒3
#4其他2
我们也可以在group by
中使用case\u将'x'值更改为'Other',其中'n'为1,然后在摘要中对'n'进行求和
library(dplyr)
data %>%
group_by(x = case_when(n ==1 ~ 'Other',
TRUE ~ x)) %>%
summarise(n = sum(n))
# A tibble: 4 x 2
# x n
# <chr> <int>
#1 Google 2
#2 IBM 3
#3 MS 3
#4 Other 2
库(dplyr)
数据%>%
当(n==1~‘其他’时,按(x=case)分组,
真~x))%>%
总结(n=总和(n))
#一个tibble:4x2
#x n
#
#1谷歌2
#2 IBM 3
#3毫秒3
#4其他2
谢谢,伙计,“cumsum”的逻辑超出了我的知识范围,我仍在弄清楚它是如何执行这种功能的magic@Vineet把它拆开。我加了一个例子,最后一个也给出了结果,请帮我理解这个问题,哈哈好!!我真的把事情弄得更复杂了:)。哦,至少他们学会了用cumsum
和diff
分组的好处
... %>% mutate(x = replace(x, grepl(',', x), 'Other'))
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
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())
data %>% {
bind_rows(filter(., n >= 2),
filter(., n < 2) %>% summarise(x = "Other", n = sum(n))
)
}
# x n
# <chr> <int>
#1 Google 2
#2 IBM 3
#3 MS 3
#4 Other 2
library(dplyr)
data %>%
group_by(x = case_when(n ==1 ~ 'Other',
TRUE ~ x)) %>%
summarise(n = sum(n))
# A tibble: 4 x 2
# x n
# <chr> <int>
#1 Google 2
#2 IBM 3
#3 MS 3
#4 Other 2