如何交替连接3个字符串

时间:2014-06-21 22:17:44

标签: string r concatenation

我有3个字符串:

a<-c("a1","a2","a3")
b<-c("b1","b2","b3")
c<-c("c1","c2","c3")

如何获得以下输出:

"a1","b1","c1","a2","b2","c2","a3","b3","c3"

以下是我的尝试:

paste(a,b,c,sep='","')

我得到了什么:

[1] "a1\",\"b1\",\"c1" "a2\",\"b2\",\"c2" "a3\",\"b3\",\"c3"

有办法吗? 谢谢。

5 个答案:

答案 0 :(得分:7)

您也可以使用

c(rbind(a,b,c))

其中(rbind)将三个变量放在一个矩阵中(逐行),然后(c())将它们转换回一个向量,利用R存储矩阵的事实按列顺序。

这个问题的答案的一些多样性源于(我认为)OP的部分(不知道这是一个理解或沟通的问题......)在组合单个字符串之间的不明确性(例如paste("a","b")生成长度为1的向量:"a b"))并组合字符串的向量c("a","b")会生成长度为2的向量:{{ 1}})

答案 1 :(得分:3)

我这样做:

interleave <- function(...) {
    ll <- list(...)
    unlist(ll)[order(unlist(lapply(ll, seq_along)))]
}
interleave(a,b,c)
# [1] "a1" "b1" "c1" "a2" "b2" "c2" "a3" "b3" "c3"

优点是您不必依赖具有相同大小的向量。例如:

a <- paste("a", 1:3, sep="")
b <- paste("b", 1:4, sep="")
c <- paste("c", 1:5, sep="")

interleave(a,b,c)
# [1] "a1" "b1" "c1" "a2" "b2" "c2" "a3" "b3" "c3" "b4" "c4" "c5"

这与this answer密切相关。

答案 2 :(得分:1)

我认为这可行:

a<-c("a1","a2","a3")
b<-c("b1","b2","b3")
c<-c("c1","c2","c3")

c(sapply(seq(1,3), function(x) c(a[x],b[x],c[x])))

[1] "a1" "b1" "c1" "a2" "b2" "c2" "a3" "b3" "c3"

答案 3 :(得分:1)

您可以使用grep将它们按照您想要的顺序放置

> x <- c(a, b, c)
> x[sapply(1:3, grep, x)]
# [1] "a1" "b1" "c1" "a2" "b2" "c2" "a3" "b3" "c3" 

unlist(strsplit(paste(a, b, c), " "))也可以。

虽然,您似乎可能正在尝试在其中粘贴逗号。如果您正在拍摄,请尝试使用cat sep参数设置为","

> cat(x[sapply(1:3, grep, x)], sep = ",")
# a1,b1,c1,a2,b2,c2,a3,b3,c3  

或者paste,但sepcollapse参数设置为","

> paste(a, b, c, sep = ",", collapse = ",")
# [1] "a1,b1,c1,a2,b2,c2,a3,b3,c3" 

答案 4 :(得分:0)

我认为你想要的是:

paste('\"', paste(a,b,c,sep='\",\"'), '\"', collapse='\",\"')

你不需要双引号来获得&#34;,#34;。内部paste()执行您尝试的操作,然后外部paste()将这些连接在一起,为您提供所需的输出。不要担心输出有&#34; \&#34;在其中 - 如果您使用cat打印出来,您将会看到它们消失。

这对你有用吗?