对 dplyr 摘要执行操作

Performing operations on dplyr summaries

假设我们有一些随机数据:

data <- data.frame(ID = rep(seq(1:3),3),
                   Var = sample(1:9, 9))

我们可以使用 dplyr 计算汇总操作,如下所示:

library(dplyr)
data%>%
  group_by(ID)%>%
  summarize(count = n_distinct(Var))

在 r markdown 块下面给出如下所示的输出:

ID count
1   3           
2   3           
3   3   

我想知道如何在不将输出保存在单独的对象中的情况下对该 dplyr 输出中的各个数据点执行操作。

例如在 summarise 的输出中,假设我们想从 ID == 1 和 [=20= 的输出值之和中减去 ID == 3 的输出值],并保留 ID == 1ID == 2 的输出值。我知道这样做的唯一方法是将摘要输出保存在另一个对象中并对该对象执行操作,如下所示:

a<-
  data%>%
  group_by(ID)%>%
  summarize(count = n_distinct(Var))
a
#now perform the operation on a
a[3,2] <- a[2,1]+a[2,2]-1
a

a 现在看起来像这样:

ID count
1   3           
2   3           
3   4

有没有办法在不创建新对象的情况下在 dplyr 输出中执行此操作?我们能以某种方式直接在这样的输出上使用 mutate 吗?

我们可以在summarisereplace后面加一个mutate来修改list

中指定的位置
library(dplyr)
data%>%
   group_by(ID)%>%
   summarize(count = n_distinct(Var)) %>% 
   mutate(count = replace(count, n(), count[2] + ID[2] - 1))

-输出

# A tibble: 3 x 2
     ID count
  <int> <dbl>
1     1     3
2     2     3
3     3     4

或者如果有两列以上,在第 sliced 行使用 sum

data%>%
   group_by(ID)%>%
   summarize(count = n_distinct(Var)) %>% 
   mutate(count = replace(count, n(), sum(cur_data() %>% 
          slice(2)) - 1))

按照您的意愿行事的备选方案(“求和其他人”),但不是您所展示的。

data %>%
  group_by(ID) %>%
  summarize(count = n_distinct(Var)) %>%
  mutate(count = if_else(ID == 3L, sum(count) - count, count))
# # A tibble: 3 x 2
#      ID count
#   <int> <int>
# 1     1     3
# 2     2     3
# 3     3     6

或者,如果还有其他ID不应该计入总和,那么

data %>%
  group_by(ID) %>%
  summarize(count = n_distinct(Var)) %>%
  mutate(count = if_else(ID == 3L, sum(count[ID %in% 1:2]), count))