当列数未知时,将行与dplyr组合

时间:2017-04-22 20:23:28

标签: r duplicates dplyr

我有几个列,包括ID列和"得分"柱。 ID列有一些重复的值。我想创建一个每个唯一ID有一行的tibble,以及与原始tibble相同的列数。对于任何ID,"得分"此新tibble中的值应该是原始tibble中ID的分数的平均值。对于任何ID,其他列的值应该是原始tibble中该ID的第一个值。

当原始tibble中的列数很小且已知时,这是一个简单的问题。例如:

scores <- tibble(
  ID    = c(1, 1, 2, 2, 3), 
  score = 1:5, 
  a     = 6:10)
scores %>% 
  group_by(ID) %>% 
  summarize(score = mean(score), a = first(a))    

但我经常使用具有数十列的字节(或数据帧)。我事先并不知道会有多少列或者如何命名。在这些情况下,我仍然需要一个函数,在每个组中包含score列的平均值和其他列的第一个值。但是拼出每一列的名称并不实际。是否有一个通用命令可以让我summarize()取一列的平均值和所有其他列的第一个值?

两步解决方案将首先使用mutate()将这些得分的平均值替换为组内的每个得分。然后我可以通过获取每组的第一行来创建我想要的tibble。但是,是否有一步一步的解决方案,可能使用dplyr中的一个select_helpers?

Summarizing unknown number of column in R using dplyr是我能找到的最接近的帖子。但是,我无法看到它说明了这个问题。

1 个答案:

答案 0 :(得分:3)

您可以使用mutate获取平均值,然后使用slice获取每组的第一行,即

library(dplyr)

scores %>% 
  group_by(ID) %>% 
  mutate(score = mean(score)) %>% 
  slice(1L)

#Source: local data frame [3 x 3]
#Groups: ID [3]

#     ID score     a
#  <dbl> <dbl> <int>
#1     1   1.5     6
#2     2   3.5     8
#3     3   5.0    10