我对社区完全陌生,希望我的问题和榜样符合标准。
我有一个带有两个字符向量的数据框。向量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)
为什么会出现这种情况以及如何解决问题? 提前谢谢!
答案 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" ""