Как выбрать значения из любого из двух столбцов на основе шаблонов в другом столбце

#r #dataframe #conditional

#r #фрейм данных #условный

Вопрос:

У меня есть фрейм данных следующим образом:

 
       x<-c(1,8,2,4,3,1)
        Y<-c(2,3,4,1,7,6)
        z<-c("abs_ro","xyz_be","hdh_ro","ahh_ra","dhhd_te","hdj_ro")
        df<-data.frame(x,y,z)

 

Я хочу создать новый столбец, значения которого будут выбраны из любого из двух столбцов x или y на основе шаблонов в столбце z. Если значения в столбце z заканчиваются на «_ro» ИЛИ «_be», код выбирает значение из x, а если оно заканчивается на «_ra» ИЛИ «_te», выбираются значения из y. x

«Я пробовал много способов, таких как grepl, grep и т. Д. никто не работал.

Ответ №1:

Для этого могут быть разные способы. Один из способов использования базы R предполагает, что у вас всегда будет один из шаблонов для x y столбца или.

 df$value <- ifelse(grepl("_ro$|_be$", df$z), df$x, df$y)

df
#  x y       z value
#1 1 2  abs_ro     1
#2 8 3  xyz_be     8
#3 2 4  hdh_ro     2
#4 4 1  ahh_ra     1
#5 3 7 dhhd_te     7
#6 1 6  hdj_ro     1
 

Или, если может быть несколько шаблонов, мы также можем использовать case_when

 library(tidyverse)

df %>%
  mutate(value = case_when(str_detect(z, "_ro$|_be$") ~ x, 
                           str_detect(z, "_ra$|_te$") ~ y, 
                           TRUE ~ NA_integer_))
 

Ответ №2:

Мы можем сделать это векторизованным способом, не полагаясь ни на какие ifelse

 df$value <- df[-3][cbind(seq_len(nrow(df)), (!grepl("_(ro|be)$", df$z))   1)]
df$value
#[1] 1 8 2 1 7 1