您可以使用tail 来抓取每个向量的最后一个条目:
lst <- strsplit(athletes.df$V1, "\\s+")
v1 <- sapply(lst, head, 1) # example with head to grab first vector element
v2 <- sapply(lst, tail, 1) # example with tail to grab last vector element
或者可能是 vapply 版本,因为您知道返回类型应该是字符向量:
v2 <- vapply(lst, tail, 1, FUN.VALUE = character(1))
另一种方法是将您的 strsplit 拆分标准修改为类似这样的内容,您可以在一个空格上进行拆分,该空格可以选择后跟任何字符一次或多次,直到找到最终空格。
strsplit(df$V1, "\\s(?:.+\\s)?")
#[[1]]
#[1] "fff" "ddd"
#
#[[2]]
#[1] "sss" "dd"
#
#[[3]]
#[1] "de" "dd"
#
#[[4]]
#[1] "dds" "rrr"
#
#[[5]]
#[1] "dsds" "eed"
正如 Sumedh 指出的,这个正则表达式可以很好地与 tidyr 的 separate 配合使用:
tidyr::separate(df, V1, c("V1", "V2"), "\\s(?:.+\\s)?")
# V1 V2
#1 fff ddd
#2 sss dd
#3 de dd
#4 dds rrr
#5 dsds eed
两种基于stringi 的方法:
library(stringi)
v1 <- stri_extract_last_regex(df$V1, "\\S+")
v2 <- stri_extract_first_regex(df$V1, "\\S+")
或者
stri_extract_all_regex(df$V1, "^\\S+|\\S+$", simplify = TRUE)
# this variant explicitly checks for the spaces with lookarounds:
stri_extract_all_regex(df$V1, "^\\S+(?=\\s)|(?<=\\s)\\S+$", simplify = TRUE)