【问题标题】:combining rows with dplyr when number of columns is unknown当列数未知时将行与 dplyr 组合
【发布时间】:2017-09-19 17:24:18
【问题描述】:

我有一个包含几列的小标题,包括一个 ID 列和一个“分数”列。 ID 列有一些重复的值。我想创建一个 tibble,每个唯一 ID 有一行,列数与原始 tibble 相同。对于任何 ID,这个新 tibble 中的“分数”值应该是原始 tibble 中 ID 的分数的平均值。对于任何 ID,其他列的值应该是该 ID 在原始 tibble 中出现的第一个值。

当原始 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() 将组内的每个分数替换为这些分数的平均值。然后我可以通过获取每组的第一行来创建我想要的小标题。但是有没有一步的解决方案,也许使用 dplyr 中的 select_helpers 之一?

Summarizing unknown number of column in R using dplyr 是我能找到的最近的帖子。但我看不出它完全说明了这个问题。

【问题讨论】:

    标签: r duplicates dplyr


    【解决方案1】:

    您可以使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 2019-02-09
      相关资源
      最近更新 更多