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