我做了一个最小可复制的例子
modelcoef <- c( 'model1_1_ef','model1_1_ev1','model1_1_ev2','model2_1_ef','model2_1_ev1','model2_1_ev2')
id <- 1:6
value <- c(3,1,4,6,4,6)
data<-data.frame(modelcoef,id,value)
subset1<- data %>%
subset(modelcoef %in% c('ev1','ev2'))
# observation 0, so failed.
我尝试基于分类变量"modelcoef"来划分我的数据子集。然而,上面的代码似乎不工作。我想对数据进行子集——我想取一个数据集,其中modelcoef列包含"ev1"或"ev2".
在这个例子中我可以手动执行,但是我的实际数据非常大,我无法手动执行
library(dplyr)
library(stringr)
library(tidyr)
modelcoef <- c( 'model1_1_ef','model1_1_ev1','model1_1_ev2','model2_1_ef','model2_1_ev1','model2_1_ev2')
id <- 1:6
value <- c(3,1,4,6,4,6)
data <- data.frame(modelcoef,id,value)
# Regular expression solution
# You can add levels with the | separator (or)
# it can be more dangerous if there is a possibility to have ev1 in other occurences of ev1 ev2 in the initial modelcoef variable
subset1 <- data %>%
filter(stringr::str_detect(modelcoef, "ev1|ev2"))
# tidyr better solution
data %>%
tidyr::separate(modelcoef, into = c("model_id", "unknown_thing", "modelcoef"), sep = "_") %>%
filter(modelcoef %in% c("ev1", "ev2"))
#> model_id unknown_thing modelcoef id value
#> 1 model1 1 ev1 2 1
#> 2 model1 1 ev2 3 4
#> 3 model2 1 ev1 5 4
#> 4 model2 1 ev2 6 6
由reprex包(v2.0.1)创建于2022-06-17
tidyr::separate()
函数以一列作为输入,并将其分离为多列。您最初的modelcoef专栏似乎遵循了这种模式(model_id)_(number)_(modelcoef)
,所以如果它对所有数据都是正确的,那么解决方案应该是有效的。它只是把你的数据分成3个单独的列。
然后你可以使用你新创建的变量"modelcoef"过滤ev1, ev2
您需要使用regex模式,ev(1|2)
在这种情况下:
library(dplyr)
library(stringr)
data %>%
filter(str_detect(modelcoef, "ev(1|2)"))
modelcoef id value
1 model1_1_ev1 2 1
2 model1_1_ev2 3 4
3 model2_1_ev1 5 4
4 model2_1_ev2 6 6