R 将多个字符串模式转换为二进制列

R 将多个字符串模式转换为二进制列,r,dplyr,stringr,R,Dplyr,Stringr,我试图使用R编程语言将特定的字符串模式转换为三个不同列的二进制列 以下是我所拥有的: have <- structure(list(rep1 = c("china", "na", "bay", "eng", "giad", "china", "sing", "giad", "na", "china", "china, camp", "guat,camp", "na", "na", "cis", "trans", "stron, mon"), rep2 = c("china", "na

我试图使用R编程语言将特定的字符串模式转换为三个不同列的二进制列

以下是我所拥有的:

have <- structure(list(rep1 = c("china", "na", "bay", "eng", "giad", 
"china", "sing", "giad", "na", "china", "china, camp", "guat,camp", 
"na", "na", "cis", "trans", "stron, mon"), rep2 = c("china", 
"na", "bay", "eng", "giad", "china", "sing", "giad", "na", "china", 
"china, camp", "camp", "na", "na", "cis", "trans", "stron, mon"
), rep3 = c("na", "na", "bay", "eng", "giad", "china", "sing", 
"giad", "china", "china", "china, camp", "camp", "na", "na", 
"cis", "trans", "stron, mon")), row.names = c(NA, -17L), class = c("data.table", 
"data.frame"))
我最大的问题是它似乎有点重复我想知道是否有更优雅的解决方案?考虑到“rep”列的数字顺序为1-3,我认为可能有更好的方法来编程


通过查看,我发现了使用
model.matrix
的方法,当您需要每个模式并且只对单个列感兴趣时,它似乎可以很好地工作。我试着把它转换成一个函数,这样我就可以选择多个列,但是我仍然必须删除带有不感兴趣的模式的字符串

这里有一种使用
mutate\u all
的方法。如果只想对特定列执行此操作,只需使用
mutate\u at
并指定列即可

library(dplyr)
library(stringr)

mutate_all(have, funs(chi = as.numeric(str_detect(., "chi")),
                  bay = as.numeric(str_detect(., "bay")),
                  gia = as.numeric(str_detect(., "gia")),
                  sin = as.numeric(str_detect(., "sin"))))
mutate_at
带有
vars
的示例:

want <- have %>% mutate_at(vars(rep1,rep2,rep3), funs( 
                           tox = as.numeric(str_detect(., "chi")), 
                           bay = as.numeric(str_detect(., "bay")), 
                           gia = as.numeric(str_detect(., "gia")), 
                           iso = as.numeric(str_detect(., "sin"))))
want%mutate_at(vars(rep1,rep2,rep3),funs(
tox=数值(str_detect(,“chi”),
间隔=如数字(str_detect(,“间隔”)),
gia=as.numeric(str_detect(,“gia”),
iso=as.numeric(str_detect(,“sin”))

以下是一些丑陋且低效(性能方面)的基本代码,您不必自己构造colnames:

want_new <- have
colold <- colnames(want_new)
for (p in pattern) {
  cname <- paste0(
    colold, 
    "_",
    p
  )
  for (col in cname) {
    want_new[, col] <- as.numeric(str_detect(
      want_new[, gsub(paste0("_", p), "", col, fixed)],
      p
    ))
  }
}

want\u new您可以通过使用purr pacakge来改进这一点-使用map\u chr而不是将它们作为字符名称导出。嗯,我看不出
map\u chr()
在这里有什么帮助。
want <- have %>% mutate_at(vars(rep1,rep2,rep3), funs( 
                           tox = as.numeric(str_detect(., "chi")), 
                           bay = as.numeric(str_detect(., "bay")), 
                           gia = as.numeric(str_detect(., "gia")), 
                           iso = as.numeric(str_detect(., "sin"))))
want_new <- have
colold <- colnames(want_new)
for (p in pattern) {
  cname <- paste0(
    colold, 
    "_",
    p
  )
  for (col in cname) {
    want_new[, col] <- as.numeric(str_detect(
      want_new[, gsub(paste0("_", p), "", col, fixed)],
      p
    ))
  }
}