我有一个包含 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/