Как выбрать значения из одного из двух столбцов на основе шаблонов в другом столбце - PullRequest
0 голосов
/ 13 апреля 2019

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


       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 и т. д., никто не работал.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2019

Могут быть разные способы сделать это. Один способ с использованием базы 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_))
0 голосов
/ 13 апреля 2019

Мы можем сделать это векторизованным способом, не полагаясь на 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
...