循环以替换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"