Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于R中另一个向量中的字符从字符串中提取字符_R_String - Fatal编程技术网

基于R中另一个向量中的字符从字符串中提取字符

基于R中另一个向量中的字符从字符串中提取字符,r,string,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) 这在大多数情况下都很有效,除了第二种情况,它返回“)”

我是这个社区的新手,希望我的问题和例子符合标准

我有一个有两个字符向量的数据帧。向量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)
这在大多数情况下都很有效,除了第二种情况,它返回“)”而不是所需的“s”

你知道为什么会这样吗?我怎样才能解决这个问题?
提前谢谢

我认为
str_sub
仅适用于字符串,但对于第二个字符串
strsplit
将为您提供2个字符串的向量

如果分隔符在每个字符串中只出现一次,则此操作将完成:

sapply(strsplit(a,split=b, fixed=FALSE), function(l) str_sub(l[[1]],-1,-1))

下面是一个使用基本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" ""
或者使用
mappy
(感谢@thelatemail)更简洁、更整洁:


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

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

我啊,这就是为什么我在处理第二个字符串时遇到问题。非常感谢。但是,您的解决方案似乎返回了b指定的字符之前的所有字符,而不仅仅是相邻的字符。我对其进行了更正,使其仅返回字符串中最后一个字符,后跟分隔符。这就完成了,非常感谢!仅作澄清:“\\1”是告诉R只返回一个字符的部分吗?@sakwa通常
“\\1”
返回组1中捕获的表达式。在本例中,这是
(\\w)
,对应于一个字符。@MARITSERVERS-点击它。@MARITSERVERS:谢谢您的解释!还有
mapply
解决方案(也叫@thelatemail)!类似的逻辑将是
strsplit
match
,然后
substr
使用相同的方式:
n非常有趣的解决方案!多谢各位@最近的邮件很好!我经常忘记使用mapply的功能。
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(function(a,b) ifelse(
    nchar(a) > 1, 
    gsub(paste0("^.*(\\w)", b, ".*$"), "\\1", a), 
    ""), a, b)
i <- mapply(regexpr, b, a) - 1
substr(a, i, i)
[1] "s" "s" "f" "f" "t" "S" ""