首页 > 解决方案 > 将行合并为一行,选择最高分

问题描述

我有一个包含多个“玩家”实例的大型数据集,我想将他们的锦标赛分数折叠成一行,但保留收入最高的那一行。这是一个大数据集,所以我不能完全粘贴整个内容,但一个小示例表如下所示:

播放器 赢得 T1。 T2 T3
约翰·多伊 2100 5 不适用 不适用
约翰·多伊 1900 不适用 12 不适用
约翰·多伊 500 不适用 不适用 16

我想通过将锦标赛 1、2、3 合并为一行来消除 N/A 值和重复行,同时保持最高收益值 (2100),使其看起来更像这样:

播放器 赢得 T1。 T2 T3
约翰·多伊 2100 5 12 16

到目前为止,我已经使用 top_n(1, Earned) 来保留收入最高的行,但它只保留了 Tournament1 的分数,我需要用他们的分数填写其他列。

标签: r

解决方案


根据您对 的参考top_n,我正在推断dplyr和相关的软件包。

  1. 如果您的列是字符串(因为"N/A"不是NA),那么

    func <- function(x, na.rm = TRUE, na = c("NA", "N/A")) {
      if (is.numeric(x)) max(x, na.rm = na.rm) else head(na.omit(setdiff(x, na)), 1)
    }
    library(dplyr)
    dat %>%
      group_by(Player) %>%
      summarize(across(everything(), func))
    # # A tibble: 1 x 5
    #   Player   Earned T1.   T2    T3   
    #   <chr>     <int> <chr> <chr> <chr>
    # 1 John Doe   2100 5     12    16   
    
  2. 但是,如果您的列是numeric,那么我们可以将其简化为

    dat %>%
      # an interim line to change your strings to numbers
      mutate(across(-Player, ~ suppressWarnings(as.numeric(.)))) %>%
      # pick up from here
      group_by(Player) %>%
      summarize(across(everything(), ~ max(., na.rm = TRUE)))
    # # A tibble: 1 x 5
    #   Player   Earned   T1.    T2    T3
    #   <chr>     <dbl> <dbl> <dbl> <dbl>
    # 1 John Doe   2100     5    12    16
    

数据

dat <- structure(list(Player = c("John Doe", "John Doe", "John Doe"), Earned = c(2100L, 1900L, 500L), T1. = c("5", "N/A", "N/A" ), T2 = c("N/A", "12", "N/A"), T3 = c("N/A", "N/A", "16")), class = "data.frame", row.names = c(NA, -3L))

推荐阅读