r - 将行合并为一行,选择最高分
问题描述
我有一个包含多个“玩家”实例的大型数据集,我想将他们的锦标赛分数折叠成一行,但保留收入最高的那一行。这是一个大数据集,所以我不能完全粘贴整个内容,但一个小示例表如下所示:
播放器 | 赢得 | 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 的分数,我需要用他们的分数填写其他列。
解决方案
根据您对 的参考top_n
,我正在推断dplyr
和相关的软件包。
如果您的列是字符串(因为
"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
但是,如果您的列是
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))
推荐阅读
- vba - 根据一列中的数值,我想在另一列中输入另一个值
- python - 在 Python 中为 formatChecker() 创建一个日期时间字符串
- php - 如何判断 PHP 是否在 PHP 中的 FPM 下运行
- python-3.x - 如何在我的数据库中插入/更新日期?我使用了 Python 3、SQLAlchemy、多处理。连接不可用
- r - 转换数据框列表:不是简单的 rbind,第二行到新列
- android - ViewPager 嵌套片段未正确替换
- php - PHP 邮件在本地主机上不起作用(Mac)
- javascript - ReferenceError:未定义tinymce
- error-handling - Lua:pcall() 不能按预期与协程一起工作
- javascript - ES6 JavaScript - const inside 还是 let outside 循环?