在 R 数据框中的多列中查找一列中的匹配值

问题描述

我有一个来自调查的数据框,其中答案选择出现的顺序是随机的,因此我们可以想象这个数据框:

example_df <- data.frame(
   Choice = c ('A','B','A','C'),Option1 = c('A','C','B'),Option2 = c('B','A'),Option3 = c('C',stringsAsFactors = FALSE
)

看起来像这样:

choice  Option1 Option2 Option3
A         A       B       C
B         A       C       B
A         C       A       B
C         B       A       C

我想要的是数据框中的一个新列,其中新列中的值是 Choice 中的值出现在其中的列的名称

在示例中,新列将是:

上面的示例 df 将生成这个新列:

Option1
Option3
Option2
Option3

解决方法

我们可以使用max.col

example_df$newcol <- names(example_df)[-1][max.col(example_df[-1] == 
         example_df$Choice)]

-输出

example_df
#  Choice Option1 Option2 Option3  newcol
#1      A       A       B       C Option1
#2      B       A       C       B Option3
#3      A       C       A       B Option2
#4      C       B       A       C Option3

或者用tidyverse

library(dplyr)
example_df  %>%
   rowwise %>%
   mutate(newcol = names(.)[-1][match(Choice,c_across(starts_with('Option')))]) %>%
   ungroup

-输出

# A tibble: 4 x 5
#  Choice Option1 Option2 Option3 newcol 
#  <chr>  <chr>   <chr>   <chr>   <chr>  
#1 A      A       B       C       Option1
#2 B      A       C       B       Option3
#3 A      C       A       B       Option2
#4 C      B       A       C       Option3