2016-12-26 54 views
0

如果我有一个字符串,访问分割字符串的元素中的R

x <- "Hello World" 

我怎样才能进入第二个字,“世界”,用字符串分割,之后

x <- strsplit(x, " ") 

X [ [2]]没有做任何事情。

+1

这是' X [[1] [2]'。 'strsplit'返回一个列表。拆分字符串位于列表结果的第一个元素中。 '“世界”是该元素的第二个值。也可以做'scan(text = x,what =“”)[2]' –

回答

1

正如在评论中提到的,重要的是要认识到strsplit返回一个列表对象。由于你的例子只是分割一个项目(一个长度为1的矢量),你的列表是长度1.我将用一个稍微不同的例子来解释,输入长度为3的矢量(3个文本项目进行分割):

input <- c("Hello world", "Hi there", "Back at ya") 

x <- strsplit(input, " ") 

> x 
[[1]] 
[1] "Hello" "world" 

[[2]] 
[1] "Hi" "there" 

[[3]] 
[1] "Back" "at" "ya" 

请注意,返回的列表有3个元素,每个元素对应一个输入向量。每个列表元素按照strsplit调用进行拆分。因此,我们可以调用任何使用[[这些列表中的元素(这是你的x[[2]]电话是干什么的,但你只有一个列表元素,这就是为什么你不能得到任何回报):

> x[[1]] 
[1] "Hello" "world" 

> x[[3]] 
[1] "Back" "at" "ya" 

现在我们可以通过附加一个[电话获得任何这些列表元素的第二部分:

> x[[1]][2] 
[1] "world" 

> x[[3]][2] 
[1] "at" 

这将从每个列表元素返回的第二项(注意,“回到雅”输入已恢复“在”在这种情况下)。您可以使用apply家族中的产品一次完成所有项目。 sapply将返回一个载体,这可能将是很好的在这种情况下:

> sapply(x, "[", 2) 
[1] "world" "there" "at" 

在这里输入(2)传递给[运营商,这意味着操作x[2]的最后一个值被应用到每个列表元素。

如果不是第二个项目,你想每个列表元素的最后的项目,我们可以sapply通话中使用tail,而不是[

> sapply(x, tail, 1) 
[1] "world" "there" "ya" 

这一次,我们已经将tail(x, 1)应用于每个列表元素,为我们提供最后一项。

作为优选,我最喜欢的应用这样的操作方式与magrittr管,用于第二单词,像这样:

x <- input %>% 
    strsplit(" ") %>% 
    sapply("[", 2) 

> x 
[1] "world" "there" "at" 

或者最后一个字:

x <- input %>% 
    strsplit(" ") %>% 
    sapply(tail, 1) 

> x 
[1] "world" "there" "ya"