如 cmets 中所述,重要的是要意识到 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"
这将返回每个列表元素的第二个项目(请注意,在这种情况下,“Back at ya”输入已返回“at”)。您可以使用apply 系列中的内容一次对所有项目执行此操作。 sapply 将返回一个向量,在这种情况下可能会很好:
> sapply( x, "[", 2 )
[1] "world" "there" "at"
此处输入的最后一个值 (2) 被传递给 [ 运算符,这意味着运算 x[2] 应用于每个列表元素。
如果您想要每个列表元素的 last 项而不是第二项,我们可以在 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"