2016-12-26 44 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"