根据R中另一个向量中的字符从字符串中提取字符

时间:2018-04-03 21:37:15

标签: r string

我对社区完全陌生,希望我的问题和榜样符合标准。

我有一个带有两个字符向量的数据框。向量a中的值的长度不同,向量b中的值都只包含一个字符。

a <- as.character(c("tsm", "skr", "fl", "pfl", "ts", "St", "S"))
b <- as.character(c("m", "k", "l", "l", "s", "t", "S"))
uedf <- data.frame(a, b)

我想在向量b中指定的字符的左侧直接提取字符。字符串中该字符的位置可以变化。所以,从第一个字符串开始,我想提取&#34; s&#34; (m的左边),在第二个&#34; s&#34; (左边是k)等等。

由于我无法弄清楚如何使用grepl()(我不熟悉正则表达式)来做到这一点,我终于得到了strsplit()和{的结合{1}}。

str_sub()

这适用于大多数情况,除了它返回的第二个&#34;)&#34;而不是期望的&#34; s&#34;。

str_sub(strsplit(uedf$a,split=uedf$b, fixed=FALSE), start = -1, end = -1)

为什么会出现这种情况以及如何解决问题? 提前谢谢!

3 个答案:

答案 0 :(得分:2)

我认为SELECT '[1, 2, 3]'::JSONB #> '{1}'; SELECT '[1, 2, 3]'::JSONB -> 1; 仅适用于字符串,但第二个字符串str_sub会为您提供2个字符串的向量。

如果分隔符仅在每个字符串中出现一次,则可以执行此操作:

strsplit

答案 1 :(得分:2)

以下是使用基础R gsub

的解决方案
sapply(1:length(a), function(i) ifelse(
    nchar(a[i]) > 1,
    gsub(paste0("^.*(\\w)", b[i], ".*$"), "\\1", a[i]),
    ""))
#[1] "s" "s" "f" "f" "t" "S" ""

使用mapply更简洁,更清洁/更整洁(感谢@thelatemail):

mapply(function(a,b) ifelse(
    nchar(a) > 1, 
    gsub(paste0("^.*(\\w)", b, ".*$"), "\\1", a), 
    ""), a, b)

答案 2 :(得分:2)

在这里,我找到与您的索引匹配的位置,并将其保存在i中。然后提取少于i的字符。

i <- mapply(regexpr, b, a) - 1
substr(a, i, i)
[1] "s" "s" "f" "f" "t" "S" ""