如何根据另一列中的模式从两列中的任一列中选择值
How to choose values from either of two columns based on patterns in on other column
我有一个数据框如下:
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等等,都没用。
可能有多种方法可以做到这一点。使用 base 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_))
我们可以在不依赖任何 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
我有一个数据框如下:
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等等,都没用。
可能有多种方法可以做到这一点。使用 base 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_))
我们可以在不依赖任何 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