如何根据另一列中的模式从两列中的任意一个选择值

时间:2019-04-13 09:43:44

标签: r dataframe conditional

我的数据框如下:


       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)

我想创建一个新的列值,该值基于z列中的模式从x或y的两个列中选择。如果z列中的值以“ _ro”或“ _be”结尾,则代码从x中选择值,如果它以“ _ra”或“ _te”结尾,则选择y形式的值。 x

`我尝试了多种方式,例如grepl,grep等,但没有人起作用。

2 个答案:

答案 0 :(得分:2)

可能有多种方法可以做到这一点。假设您将始终具有xy列的模式之一,则使用基数R的一种方法。

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_))

答案 1 :(得分:0)

我们可以向量化的方式进行操作,而无需依赖任何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