0

我有一个字符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这个。

4

6 回答 6

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")
于 2019-03-18T10:28:50.603 回答
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
于 2019-03-18T10:30:47.473 回答
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 的帮助下,答案得到了改进

于 2019-03-18T10:32:48.043 回答
0

一个简单而简洁的替代方案

sapply(a,function(x){last(which(strsplit(x,"")[[1]]==" "))})

    Mt. Everest         Cho oyu      Mont Blanc Ojos del Salado 
              4               4               5               9 
于 2019-03-18T17:23:50.920 回答
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
于 2019-03-18T12:39:43.697 回答
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")
于 2019-03-18T10:33:31.533 回答