循环以替换R中字符串/因子变量/向量中的字符
我有一个列,基本上类似于以下字符串集:循环以替换R中字符串/因子变量/向量中的字符,r,regex,string,R,Regex,String,我有一个列,基本上类似于以下字符串集: v <- c("1 - IOP A", "1 - PHP B", "1 - RES C", "2 - IOP A", "2 - PHP B", "18 - IOP A", "18 - PHP A", "18 - RES D") 这是我尝试过的,但它不起作用,没有提供错误消息,没有任何更改,我
v <- c("1 - IOP A", "1 - PHP B", "1 - RES C", "2 - IOP A", "2 - PHP B", "18 - IOP A", "18 - PHP A", "18 - RES D")
这是我尝试过的,但它不起作用,没有提供错误消息,没有任何更改,我不确定为什么或者因此下一步该怎么做/出了什么问题。我假设这与在字符串模式参数中使用循环索引有关,但我不知道如何告诉程序使用索引值
for (i in 1:18) {
sub(pattern = "i - ", replacement = "", v)
}
我将非常感谢任何人向我展示实现这一点的最优雅甚至多种方法,因为这是一项非常基本的数据工程任务。我相信还有一种更快的方式来编写这段代码
谢谢:)您可以删除所有内容,直到
“-”
并获取唯一值
unique(sub('.*-\\s', '', v))
#[1] "IOP A" "PHP B" "RES C" "PHP A" "RES D"
或与您的尝试类似,将\\d
作为数字的占位符
unique(sub('\\d+ - ', '', v))
因为sub
/gsub
是向量化的,所以它们直接作用于向量,所以这里不需要sapply
或来进行循环。我可以推荐一种使用strsplit
的方法,它甚至不使用正则表达式:
unique(sapply(v, function(x) strsplit(x, " - ")[[1]][2]))
[1] "IOP A" "PHP B" "RES C" "PHP A" "RES D"
其思想是只保留字符串中位于空格连字符空格分隔符之后的部分
数据:
v <- c("1 - IOP A", "1 - PHP B", "1 - RES C", "2 - IOP A", "2 - PHP B", "18 - IOP A",
"18 - PHP A", "18 - RES D")
v以下是使用stringr
软件包中的函数的两个备选解决方案
library(stringr)
library(magrittr)
# data
v <- c("1 - IOP A", "1 - PHP B", "1 - RES C", "2 - IOP A", "2 - PHP B", "18 - IOP A", "18 - PHP A", "18 - RES D")
# solution 1
str_remove(str_extract(v, pattern = "(?>-).*"), "-") %>% str_trim()
#[1] "IOP A" "PHP B" "RES C" "IOP A" "PHP B" "IOP A" "PHP A" "RES D"
使用str\u从stringr
library(stringr)
unique( str_remove(v, "\\d+\\s*-\\s*"))
#[1] "IOP A" "PHP B" "RES C" "PHP A" "RES D"
# solution 2
v <- c("1 - IOP A", "1 - PHP B", "1 - RES C", "2 - IOP A", "2 - PHP B", "18 - IOP A", "18 - PHP A", "18 - RES D")
v1 <- str_replace_all(v, pattern = "([0-9])", replacement = " ")
v2 <- str_replace(v1, pattern = "-", replacement = "")
v2 %>% str_trim()
#[1] "IOP A" "PHP B" "RES C" "IOP A" "PHP B" "IOP A" "PHP A" "RES D"
library(stringr)
unique( str_remove(v, "\\d+\\s*-\\s*"))
#[1] "IOP A" "PHP B" "RES C" "PHP A" "RES D"