问题描述
我有一个来自调查的数据框,其中答案选择出现的顺序是随机的,因此我们可以想象这个数据框:
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