【问题标题】:Return column names based on condition根据条件返回列名
【发布时间】:2018-10-30 08:27:05
【问题描述】:

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

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

编辑:我忘了提到我的数据中的某些列有 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 (v0.2.1) 于 2018 年 10 月 30 日创建

【问题讨论】:

    标签: r dplyr tidyverse purrr


    【解决方案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 
    

    对于每一行,我们检查哪个位置有最大值,paste 和该位置的names 一起检查。


    如果您更喜欢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每一行我们paste列名称为maxkey,然后spread将长数据帧再次转换为宽。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-06
      • 2020-10-23
      • 1970-01-01
      • 2021-08-28
      • 2022-07-21
      • 1970-01-01
      相关资源
      最近更新 更多