首页 > 解决方案 > 在 R 数据框中的多列中查找一列中的匹配值

问题描述

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

example_df <- data.frame(
   Choice = c ('A', 'B', 'A', 'C'), 
   Option1 = c('A', 'A', 'C', 'B'),
   Option2 = c('B', 'C', 'A', 'A'),
   Option3 = c('C', 'B', 'B', '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

标签: rdataframematching

解决方案


我们可以用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

推荐阅读