我已经尝试在互联网上为我的问题找到一个解决方案,我觉得我知道所有小块但我无法把它们放在一起。我非常了解编程,所以请耐心等待:D ......
我有一个(实际上更大)文本字符串,如下所示:
string <- "Test test [438] test. Test 299, test [82]."
现在我想使用查找表替换方括号中的数字并返回一个新字符串。文中还有其他数字,但我只想更改括号中的数字,并需要将它们放回括号中。
lookup <- read.table(text = "
Number orderedNbr
1 270 1
2 299 2
3 82 3
4 314 4
5 438 5", header = TRUE)
我制作了一个模式,使用正则表达式找到方括号
pattern <- "\\[(\\d+)\\]"
现在我四处寻找并尝试了sub / gsub,lapply,merge,str_replace,但我发现自己无法使其工作......我不知道怎么告诉R!查看括号内的内容,在查找表中查找相同的参数,并列出下一栏中的内容。
我希望你能帮助我,而且这不是一个非常愚蠢的问题。 THX
答案 0 :(得分:2)
我们可以使用正则表达式查看仅匹配方括号内的数字
library(gsubfn)
gsubfn("(?<=\\[)(\\d+)(?=\\])", setNames(as.list(lookup$orderedNbr),
lookup$Number), string, perl = TRUE)
#[1] "Test test [5] test. Test [3]."
或者paste
每个“查找”列上的方括号都没有正则表达式的外观
gsubfn("(\\[\\d+\\])", setNames(as.list(paste0("[", lookup$orderedNbr,
"]")), paste0("[", lookup$Number, "]")), string)
答案 1 :(得分:2)
将您的键和值表(2列表)读入数据框。如果源信息是平面文本文件,则可以轻松使用git checkout v1.0
git submodule update
git submodule
来获取数据框。在下面的示例中,我只使用两个条目对数据帧进行硬编码。然后,我迭代它并在输入字符串中进行替换。
read.csv
注意:正如@Frank明智地指出的那样,如果您的数字标记(例如df <- data.frame(keys=c(438, 82), values=c(5, 3))
string <- "Test test [438] test. Test [82]."
for (i in 1:nrow(df)) {
string <- gsub(paste0("(?<=\\[)", df$keys[i], "(?=\\])"), df$values[i], string, perl=TRUE)
}
string
[1] "Test test 5 test. Test 3."
)碰巧有替换数字也会出现作为其他标记,那么我的解决方案将会失败。也就是说,如果用值替换键导致另一个键,则可能存在问题。如果这是一种可能性,我建议使用不会发生这种情况的标记。例如,您可以在每次更换后删除括号。
答案 2 :(得分:1)
您可以将regmatches<-
与包含前瞻/后瞻的模式一起使用:
patt = "(?<=\\[)\\d+(?=\\])"
m = gregexpr(patt, string, perl=TRUE)
v = as.integer(unlist(regmatches(string, m)))
`regmatches<-`(string, m, value = list(lookup$orderedNbr[match(v, lookup$Number)]))
# [1] "Test test [5] test. Test 299, test [3]."
或者直接修改字符串,将最后一行更改为更易读...
regmatches(string, m) <- list(lookup$orderedNbr[match(v, lookup$Number)])