使用粘贴列表

时间:2014-11-25 05:56:33

标签: r paste strsplit

我正在尝试理解strsplitpaste的行为,它们是反函数。但是,当我strsplit向量时,会返回一个列表,如下所示:

> strsplit(c("on,e","tw,o","thre,e","fou,r"),",")
[[1]]
[1] "on" "e" 

[[2]]
[1] "tw" "o" 

[[3]]
[1] "thre" "e"   

[[4]]
[1] "fou" "r"  

我尝试将lapply重新使用cat列表中的元素,但它不起作用:

> lapply(strsplit(c("on,e","tw,o","thre,e","fou,r"),","),cat)
on etw othre efou r[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
NULL

使用paste代替cat的相同公式实际上什么都不做!为什么我得到这些结果?我怎样才能得到我想要的结果,这又是原始的向量?

(显然,在我的实际代码中,我尝试使用strsplitcat做更多事情,而不仅仅是返回原始向量,但我认为解决此问题的方法对我来说很有用。谢谢!)

1 个答案:

答案 0 :(得分:6)

虽然是,但cat将连接并打印到控制台,它实际上并没有以paste的方式运行。这个结果在help("cat")

中得到了最好的解释

collapse中的paste参数实际上与split中的strsplit参数相反。您可以使用sapply返回简化的粘贴矢量。

x <- c("on,e","tw,o","thre,e","fou,r")

( y <- sapply(strsplit(x, ","), paste, collapse = ",") )
# [1] "on,e"   "tw,o"   "thre,e" "fou,r" 
( z <- vapply(strsplit(x, ","), paste, character(1L), collapse = ",") )
# [1] "on,e"   "tw,o"   "thre,e" "fou,r"

identical(x, y)
# [1] TRUE
identical(x, z)
# [1] TRUE

请注意,对于此类情况,vapply将比sapply更有效。在fixed = TRUE中添加strsplit也可以提高效率。