首页 文章

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

提问于
浏览
0

我有一些包含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 回答

  • 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
    

相关问题