2016-11-15 153 views
0

我有一个像分割字符串在中东

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

对不起,它是在qdap – erocoar

回答

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

这是一些代码来获得第一个名字。

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))) 
0

如果您始终想要在“中间”即每6个单词分割一次,请获取最后3个...我不会“T认为这是一个非常一致的分析机制,但我不知道整个数据集显然这应该与包装工作: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"