首页 > 解决方案 > 循环替换R中字符串/因子变量/向量中的字符

问题描述

我有一个基本上看起来像以下字符串集的列:

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")

所有这些都是或将成为因素。我的数据集中有将近 300 个。我的目标是将这些级别组合成仅由这些其他字母数字字符串的字母部分表示的类别。从上面的示例中,所需的输出将是:

c("IOP A", "PHP B", "RES C", "PHP A", "RES D")

这是我尝试过的,但它不起作用,没有提供错误消息,没有任何变化,而且我不确定为什么或因此下一步要做什么/出了什么问题。我假设它与在字符串模式参数中使用循环索引有关,但我不知道如何告诉程序使用索引值。

for (i in 1:18) {
    sub(pattern = "i - ", replacement = "", v)
}

我会很感激任何人向我展示最优雅甚至多种方式来实现这一点,因为这是一项非常基础的数据工程任务。我敢肯定还有一种更快的 sapply 方法来编写此代码。

谢谢 :)

标签: rregexstring

解决方案


您可以删除所有内容,"-"然后unique取值。

unique(sub('.*-\\s', '', v))
#[1] "IOP A" "PHP B" "RES C" "PHP A" "RES D"

或类似于您的尝试,\\d作为数字的占位符。

unique(sub('\\d+ - ', '', v))

您不需要sapplyfor在此处循环,因为sub/gsub已矢量化,因此它们直接在矢量上工作。


推荐阅读