使用group_by和summarise(sum)函数时保留大量的附加列。

3
我想要按照一个变量对数据框进行分组,对另一个变量进行总结,但保留所有其他相关列。在应用group_by和summarize时保留所有列信息的数据中,被接受的答案是使用filter()或slice(),如果答案已经存在于数据中(即min,max),那么这很好用,但如果您想使用生成新答案的函数(即sum,mean),则无法使用这种方法。在应用group_by和summarize(sum)但保留具有不相关冲突数据的列时?中,被接受的答案是将您想要保留的所有列都作为分组变量的一部分。但是,如果您有许多要保留的列,则这似乎是一种低效的解决方案。例如,我正在处理的数据还有26个附加列。我想到的最好的解决办法是split-apply-combine。但这看起来很笨重 - 必须有一种可以在单个管道中完成的解决方案。例如:
location <- c("A", "A", "B", "B", "C", "C")
date <- c("1", "2", "1", "2", "1", "2")
count <- c(3, 6, 4, 2, 7, 5)
important_1 <- c(1,1,2,2,3,3)
important_30 <- c(4,4,5,5,6,6)

df <- data.frame(location = location, date = date, count = count, important_1 = important_1, important_30 = important_30)

我希望总结同一位置不同日期发生的计数。我想保留所有重要信息(想象成30而不是2)。

迄今为止,我的解决方案:

check <- df %>%
  group_by(location) %>%
  summarise(count = sum(count))

add2 <- df %>%
  select(-count, -date) %>%
  distinct()

results <- merge(check, add2)

我能否在一个流水线中完成这个任务?如果可能的话,我宁愿保持有条理并避免创建新对象。


1
important_2 未被定义。 - akrun
2个回答

3
我们可以使用mutate创建一列,然后应用distinct
library(dplyr)
df %>% 
   group_by(location) %>% 
   mutate(count = sum(count)) %>% select(-date) %>% 
   distinct(location,  important_1, important_30, .keep_all = TRUE)

如果有多个列名,我们还可以使用syms将其转换为symbol并进行评估 (!!!)
df %>% 
     group_by(location) %>% 
     mutate(count = sum(count)) %>% select(-date) %>% 
    distinct(location, !!! rlang::syms(names(.)[startsWith(names(.), 'important')]), .keep_all = TRUE)

我认为第一种解决方案很好。第二种解决方案在我的实际数据中不起作用,因为“重要”的列实际上并没有包含“important”这个词。我试图让我的示例简单明了,但也许我应该让它更接近真实数据。 - canderson156
@canderson156 在这种情况下,您可以使用索引来对名称进行子集化,即 rlang::syms(names(.)[c(1, 2, 3, ...)] - akrun
@canderson156,或许你可以尝试使用group_by_at,例如df %>% group_by_at("location", names(.)[4:5)) %>% summarise(count = sum(count)) - akrun

-1
你可以使用group_by来分组所有想要保留的变量,并使用sum count进行计算。
library(dplyr)

df %>% 
  group_by(location, important_1, important_30) %>% 
  summarise(count = sum(count))


#  location important_1 important_30 count
#  <chr>          <dbl>        <dbl> <dbl>
#1 A                  1            4     9
#2 B                  2            5     6
#3 C                  3            6    12

正如我在问题中解释的那样,我想保留26列。写出所有这些名称很繁琐,因此我希望找到一种替代方案。我简化了示例以便于阅读代码,但不仅有2列可以轻松添加到group_by中。 - canderson156

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接