R 对于一组固定的模式,如何检测字符串中是否存在模式?

R 对于一组固定的模式,如何检测字符串中是否存在模式?,r,multiple-columns,purrr,mutate,tidymodels,R,Multiple Columns,Purrr,Mutate,Tidymodels,在变量选择的上下文中,我试图计算在自举迭代中选择变量的次数。下面提供了该问题的一个简单版本,以及我的解决方案(answer)。但是,当处理50或100个变量时,我的解决方案很快就会变得笨拙 我有一组我想计算的变量名(pred),因此我认为应该可以基于这些值创建新列,然后检测每个列的相关字符串。但是,如果不手动设置列名并粘贴函数,我就不知道该怎么做。一定有更好的办法 欢迎任何其他解决方案,包括tidyverse或purrr library(dplyr) df <- mtcars n <

在变量选择的上下文中,我试图计算在自举迭代中选择变量的次数。下面提供了该问题的一个简单版本,以及我的解决方案(
answer
)。但是,当处理50或100个变量时,我的解决方案很快就会变得笨拙

我有一组我想计算的变量名(
pred
),因此我认为应该可以基于这些值创建新列,然后检测每个列的相关字符串。但是,如果不手动设置列名并粘贴函数,我就不知道该怎么做。一定有更好的办法

欢迎任何其他解决方案,包括tidyverse或purrr

library(dplyr)

df <- mtcars
n <- nrow(df)
pred <- colnames(df)[2:length(df)]
target <- "mpg"
mpg_formula <- paste(target, "~", paste(pred, collapse = "+"))

steplm <- data.frame()

bootnum <- 10

for (i in 1:bootnum) {
  message("Fitting model ", i, " out of ", bootnum)
  data.id <- sample(1:dim(df)[1], replace = T)
  fit.lms <- step(lm(mpg_formula, data=df[data.id, ]), 
                  direction = "backward",
                  trace = 0)
  selected.vars <- paste(sort(names(coef(fit.lms)[-1])), collapse = ", ")
  step.result <- data.frame("model" = selected.vars,
                            "nvar" = length(names(coef(fit.lms)[-1])))
  steplm <- dplyr::bind_rows(steplm, step.result)
}

steplm %>%
  transmute(
      steplm %>%
  transmute(
      cyl = grepl(pattern = "cyl",  x = model),
     disp = grepl(pattern = "disp", x = model),
       hp = grepl(pattern = "hp",   x = model),
     drat = grepl(pattern = "drat", x = model),
       wt = grepl(pattern = "wt",   x = model),
     qsec = grepl(pattern = "qsec", x = model),
       vs = grepl(pattern = "vs",   x = model),
       am = grepl(pattern = "am",   x = model),
     gear = grepl(pattern = "gear", x = model),
     carb = grepl(pattern = "carb", x = model)
  ) -> answer

您可以使用
sapply

sapply(pred, grepl, steplm$model)

#        cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
# [1,] FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE
# [2,]  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE  TRUE
# [3,] FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE
# [4,] FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE
# [5,] FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE
# [6,]  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE
# [7,] FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE
# [8,] FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE FALSE  TRUE FALSE
# [9,] FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE
#[10,]  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE
sapply
返回一个矩阵。如果需要数据帧,可以将
data.frame
包装到
sapply
输出

identical(data.frame(sapply(pred, grepl, steplm$model)), answer)
#[1] TRUE

您可以使用
sapply

sapply(pred, grepl, steplm$model)

#        cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
# [1,] FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE
# [2,]  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE  TRUE
# [3,] FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE
# [4,] FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE
# [5,] FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE
# [6,]  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE
# [7,] FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE
# [8,] FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE FALSE  TRUE FALSE
# [9,] FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE
#[10,]  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE
sapply
返回一个矩阵。如果需要数据帧,可以将
data.frame
包装到
sapply
输出

identical(data.frame(sapply(pred, grepl, steplm$model)), answer)
#[1] TRUE

你可以考虑采用不同的方法进行引导重采样,

库(tidyverse)
图书馆(rsample)
图书馆(扫帚)
汽车后备箱自举采样
#>#A tible:100 x 2
#>拆分id
#>                     
#>1 Bootstrap001
#>2 Bootstrap002
#>3引导程序P003
#>4引导程序P004
#>5.开机自检P005
#>6 Bootstrap006
#>7引导程序P007
#>8 Bootstrap008
#>9 Bootstrap009
#>10 Bootstrap010
#>#…还有90行
fit_mpg#A tible:645 x 8
#>拆分id模型术语估计标准误差统计p值
#>                                        
#>1234567810#…还有635行
启动系数%>%
选择(id,术语)%>%
过滤器(术语!=“(截取)”)%>%
变异(值=真)%>%
完成(id、术语、填充=列表(值=假))%>%
枢轴(名称从=术语,值从=值)
#>#tibble:100 x 11
#>id am carb cyl disp牵引齿轮hp qsec vs wt
#>                     
#>1 Bootstrap001真假假假真假假真
#>2 Bootstrap002假真假假真假假假真
#>3 Bootstrap003 TRUE FALSE FALSE FALSE TRUE FALSE TRUE
#>4 Bootstrap004假-真-假-真
#>5 Bootstrap005假-真-假-真-假-假-真
#>6 Bootstrap006假假真假假真
#>7 Bootstrap007 FALSE FALSE FALSE FALSE TRUE FALSE TRUE
#>8 Bootstrap008 FALSE FALSE TRUE FALSE TRUE FALSE TRUE
#>9 Bootstrap009真假假假真假假
#>10 Bootstrap010假真假假假假真
#>#…还有90行

>(v2.0.0)

在2021-04-07中,您可以考虑采用不同的方法进行引导重采样,

库(tidyverse)
图书馆(rsample)
图书馆(扫帚)
汽车后备箱自举采样
#>#A tible:100 x 2
#>拆分id
#>                     
#>1 Bootstrap001
#>2 Bootstrap002
#>3引导程序P003
#>4引导程序P004
#>5.开机自检P005
#>6 Bootstrap006
#>7引导程序P007
#>8 Bootstrap008
#>9 Bootstrap009
#>10 Bootstrap010
#>#…还有90行
fit_mpg#A tible:645 x 8
#>拆分id模型术语估计标准误差统计p值
#>                                        
#>1234567810#…还有635行
启动系数%>%
选择(id,术语)%>%
过滤器(术语!=“(截取)”)%>%
变异(值=真)%>%
完成(id、术语、填充=列表(值=假))%>%
枢轴(名称从=术语,值从=值)
#>#tibble:100 x 11
#>id am carb cyl disp牵引齿轮hp qsec vs wt
#>                     
#>1 Bootstrap001真假假假真假假真
#>2 Bootstrap002假真假假真假假假真
#>3 Bootstrap003 TRUE FALSE FALSE FALSE TRUE FALSE TRUE
#>4 Bootstrap004假-真-假-真
#>5 Bootstrap005假-真-假-真-假-假-真
#>6 Bootstrap006假假真假假真
#>7 Bootstrap007 FALSE FALSE FALSE FALSE TRUE FALSE TRUE
#>8 Bootstrap008 FALSE FALSE TRUE FALSE TRUE FALSE TRUE
#>9 Bootstrap009真假假假真假假
#>10 Bootstrap010假真假假假假真
#>#…还有90行
由(v2.0.0)于2021-04-07创建