根据条件返回列名

标签 r dplyr tidyverse purrr

我有一个包含 18 列的数据集,我需要从中返回每个观察值具有最高值的列名称,下面是简单的示例。我遇到了this答案,它几乎满足了我的需要,但在某些情况下,我需要组合名称(例如下面的 maxcol 中的 ab)。我该怎么做?

如有任何建议,我们将不胜感激!如果可能的话,我会更容易理解基于 tidyverse 的解决方案,因为我比基础更熟悉它。

编辑:我忘了提及我的数据中的某些列具有 NA。

library(dplyr, warn.conflicts = FALSE)

#turn this
Df <- tibble(a = 4:2, b = 4:6, c = 3:5)

#into this
Df <- tibble(a = 4:2, b = 4:6, c = 3:5, maxol = c("ab", "b", "b"))

reprex package于2018年10月30日创建(v0.2.1)

最佳答案

继续linked post中的答案,我们可以做到

Df$maxcol <- apply(Df, 1, function(x) paste0(names(Df)[x == max(x)], collapse = ""))

Df

#      a     b     c maxcol
#  <int> <int> <int> <chr> 
#1     4     4     3  ab    
#2     3     5     4  b     
#3     2     6     5  b 

对于每一行,我们检查哪个位置具有最大值,并将该位置的名称粘贴在一起。


如果您更喜欢 tidyverse 方法

library(tidyverse)
Df %>%
  mutate(row = row_number()) %>%
  gather(values, key, -row) %>%
  group_by(row) %>%
  mutate(maxcol = paste0(values[key == max(key)], collapse = "")) %>%
  spread(values, key) %>%
  ungroup() %>%
  select(-row)

# maxcol     a     b     c
#  <chr>  <int> <int> <int>
#1 ab         4     4     3
#2 b          3     5     4
#3 b          2     6     5

我们首先使用gather将数据帧从宽格式转换为长格式,然后group_by每行粘贴列名称作为max key 然后再次将长数据帧扩展为宽数据帧。

关于根据条件返回列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53060131/

相关文章:

r - 遍历 dplyr 中的列?

r - 选择行,根据行创建单独的数据集

r - 具有分位数和其他功能的 dplyr summarise_all

r - 在不同的文件位置从 R Markdown 创建 PDF

r - 使用ggplot2和viridis,根据其他变量填充直方图

R模型.矩阵设置

r - dplyr `across()` 分组时的函数和数据帧长度

r - 如何使用purrr循环一个整齐的评估函数?

r - 什么 'Can' t 在顶层使用 `!!!`。是什么意思以及如何解决?

r - 根据值将逗号分隔的数字列拆分为多列