使用%in%对r中的数据(基于分类变量)进行子集



我做了一个最小可复制的例子

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

最新更新