我有一个字符向量x
,
[1] "Mt. Everest" "Cho oyu" "Mont Blanc" "Ojos del Salado"
我正在寻找一个输出,给我最后一个空格的索引
[1] 4 4 5 9
我相信我需要使用sapply,以便我的函数适用于向量中的每个项目,但是无法编写:
sapply(x,myFunction)
对于myFunction
,我写着类似的东西:
myFunction <- function(a){
match(a,c(" "))
}
可以理解地给出了所有NA
,因为没有一个项目仅仅是一个空格。
我不想为此使用stringr
。
答案 0 :(得分:1)
使用mapply
的一种方法是在空格上分割字符,计算最后一个元素的字符数,然后从字符串的总字符中减去。
myFunction <- function(a){
mapply(function(p, q) q - nchar(p[length(p)]), strsplit(a, "\\s+"), nchar(a))
}
myFunction(x)
#[1] 4 4 5 9
工作原理:
让我们从列表中获取最后一个元素:
x <- "Ojos del Salado"
#Split on whitespace
p = strsplit(x, "\\s+")[[1]]
p
#[1] "Ojos" "del" "Salado"
#Select the last element
p[length(p)]
#[1] "Salado"
#Count the number of characters in the last element
nchar(p[length(p)])
#[1] 6
#Subtract it from total characters in x
nchar(x) - nchar(p[length(p)])
#[1] 9
数据
x <- c("Mt. Everest", "Cho oyu" ,"Mont Blanc", "Ojos del Salado")
答案 1 :(得分:1)
regexpr
会...
v <- c("Mt. Everest", "Cho oyu", "Mont Blanc", "Ojos del Salado")
#find position of space, not followed by a space until the end of string
regexpr(" [^ ]*$", v)
#int [1:4] 4 4 5 9
或
library(dplyr)
data.frame( v = v ) %>% mutate( lastspace = regexpr(" [^ ]*$", v) )
# v lastspace
# 1 Mt. Everest 4
# 2 Cho oyu 4
# 3 Mont Blanc 5
# 4 Ojos del Salado 9
答案 2 :(得分:1)
您可以使用gregexpr
x = c("Mt. Everest", "Cho oyu", "Mont Blanc", "Ojos del Salado")
lapply(gregexpr(pattern=" ", x), max)
如果您希望将答案作为矢量
> sapply(gregexpr(pattern=" ", x), max)
[1] 4 4 5 9
信用:通过@markus的帮助,答案得到了改善
答案 3 :(得分:0)
使用stringr
:
library(stringr)
myFunction <- function(a){
str_locate(a, " (?=[^ ]*$)")[, 1]
}
myFunction(x)
# [1] 4 4 5 9
使用stringi
(并避免使用正则表达式):
library(stringi)
myFunction2 <- function(a){
stri_locate_last_fixed(a, " ")[, 1]
}
myFunction2(x)
# [1] 4 4 5 9
使用基数R中的strsplit()
(并同时避免使用正则表达式):
myFunction3 <- function(a){
sapply(strsplit(x, ""), function(x) max(which(x == " ")))
}
myFunction3(x)
# [1] 4 4 5 9
数据:
x <- c("Mt. Everest", "Cho oyu", "Mont Blanc", "Ojos del Salado")
答案 4 :(得分:0)
您也可以尝试grepRaw()
:
sapply(x, function(x) max(grepRaw(" ", x, all = TRUE)))
Mt. Everest Cho oyu Mont Blanc Ojos del Salado
4 4 5 9
使用dplyr
:
data.frame(x) %>%
mutate(res = sapply(x, function(x) max(grepRaw(" ", x, all = TRUE))))
x res
1 Mt. Everest 4
2 Cho oyu 4
3 Mont Blanc 5
4 Ojos del Salado 9
答案 5 :(得分:0)
一种简单而简洁的选择
sapply(a,function(x){last(which(strsplit(x,"")[[1]]==" "))})
Mt. Everest Cho oyu Mont Blanc Ojos del Salado
4 4 5 9