#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