R 将多个字符串模式转换为二进制列
我试图使用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
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
))
}
}