我有一个像
这样的字符串列表1 Aken Jan van Jan van Aken
2 Albani Stephan Stephan Albani
我希望将它完全分割在中间,这样我就可以保留后者。
有没有比循环更好的选择?
library(qdap)
test <- "Aken van Jan Jan van Aken"
paste0(strsplit(test," ")[[1]][((word_count(test)/2)+1):word_count(test)], collapse=' ')
答案 0 :(得分:2)
以下是获取名字的一些代码。
test <- "Aken van Jan Jan van Aken"
test1 <- "Albani Stephan Stephan Albani"
l=list(test, test1)
i=lapply(l, function(x) substr(x, start = 1, stop = ceiling(nchar(x)/2)))
j=lapply(l, function(x) substr(x, start = ceiling(nchar(x)/2), stop = nchar(x) ))
答案 1 :(得分:1)
将dput(df)
视为:
structure(list(s1 = structure(1:2, .Label = c("Aken Jan van Jan van Aken",
"Albani Stephan Stephan Albani"),
class = "factor")), .Names = "s1",
row.names= c(NA, -2L), class = "data.frame")
你可以试试这个:
df %>%
mutate(half_string=
substr(s1, nchar(as.character(s1))/2, nchar(as.character(s1)))) %>%
select(half_string)
或使用stringr
包:
df %>%
mutate(half_string = str_sub(s1, start=nchar(as.character(s1))/2)) %>%
select(half_string)
注意:nchar(as.character(s1))/2
在小数位的情况下获取屋顶值,如果您想使用上限值,请尝试使用nchar(as.character(s1))/2 + 0.5
答案 2 :(得分:0)
如果你总是希望分成“中间”即每6个单词,那么得到最后3个...我认为这不是一个非常一致的解析机制但我不知道整个数据集明显这应该适用于package:stringi
f.split <- function(str){
as.character(
stri_extract_all_regex(
str,
sprintf('((\\w+) ?){%s}$',
stri_count_words(str)/2),
simplify = T)
)
}
它也是矢量化的,因此迭代不是问题:
f.split(c("Aken Jan van Jan van Aken","Albani Stephan Stephan Albani"))
[1] "Jan van Aken" "Stephan Albani"