是否有一个R函数来查找一行中与列中其他名称不匹配的最高值?

deikduxw  于 2023-06-27  发布在  其他
关注(0)|答案(1)|浏览(87)

以下是我目前使用的R代码:

library('tidyverse')
library ('dplyr')

Brian <- c(92.835, 89.035, 99.222, 93.581)
Buckley <- c(75.265, 86.258, 93.972, 96.872)
Chris <- c(91.442, 103.999, 91.291, 92.505)
Catherine <- c(81.244, 73.040, 78.455, 98.972)
David <- c(87.153, 60.062, 62.248, 87.852)
Donald <- c(93.395, 91.905, 102.502, 107.63)
Greg <- c(79.571, 73.702, 67.326, 89.493)
Matt <- c(78.585, 48.074, 81.387, 76.074)
Michael <- c(96.933, 78.709, 82.623, 66.325)

df <- data.frame(Brian, Buckley, Chris, Catherine, David, Donald, Greg, Matt, Michael)
group1 <- data.frame(Brian, Matt, Michael)
group2 <- data.frame(Buckley, Chris, Catherine)
group3 <- data.frame(David, Donald, Greg)

group1a <- group1 %>%
  mutate(Group1 = names(.)[max.col(.)])

group2a <- group2 %>%
  mutate(Group2 = names(.)[max.col(.)])

group3a <- group3 %>%
  mutate(Group3 = names(.)[max.col(.)])

GROUP1 <- dplyr::pull(group1a, 'Group1')
GROUP2 <- dplyr::pull(group2a, 'Group2')
GROUP3 <- dplyr::pull(group3a, 'Group3')

ALL <- cbind(df, GROUP1, GROUP2, GROUP3)

代码显示了一个长得多的表的4行。我一直在寻找代码,它允许我向这个表中添加一个列,其中包括行中最高值的列名,而不是列GROUP1,GROUP2,GROUP3中的名称之一。输出列将以“GROUP4”为标题,并且将包括这四行的Brian、Buckley、Chris、Buckley。
我试着通过dplyr寻找适合这个问题的代码,但我是新来的,有点难住了。

xytpbqjk

xytpbqjk1#

(possible_names <- select(
  ALL,
  where(is.numeric)
) |> names())
(excl_names <- select(
  ALL,
  where(\(x)!is.numeric(x))
) |> names())

ALL2 <- mutate(rowwise(ALL),
  cols_to_check = list(setdiff(
    possible_names,
    c_across(all_of(excl_names))
  ))
)

(ALL3 <- ALL2 |> mutate(GROUP4 = (\(x){
  x[max.col(pick(x))]})(c_across(cols_to_check))
  ) |> ungroup() |> select(-cols_to_check))

相关问题