Как альтернативно объединить 3 строки

У меня есть 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"

Есть ли способ сделать это? Спасибо.

Ответы

Ответ 1

Вы также можете использовать

c(rbind(a,b,c))

который (rbind) объединяет три переменные в матрицу (по строке), а затем (c()) преобразует их обратно в вектор, используя тот факт, что R хранит матрицы по столбцам порядок.

Некоторые из разнообразия ответов на этот вопрос возникают (я думаю) из-за отсутствия ясности в части OP (не знаю, является ли это проблемой понимания или общения...) между объединением отдельных строк символов (например, paste("a","b") приводит к вектору длины 1: "a b")) и сочетанию векторов символьных строк (c("a","b") приводит к вектору длины 2: "a" "b")

Ответ 2

Я бы сделал это следующим образом:

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"

Это тесно связано с этим ответом.

Ответ 3

Я думаю, это может сработать:

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"

Ответ 4

Вы можете использовать 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, но с аргументами sep и collapse, установленными на ","

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

Ответ 5

Я думаю, что вы хотите:

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

Вам не нужны двойные кавычки, чтобы получить ",". Внутренний paste() делает то, что вы пытались, а внешний paste() объединяет все это вместе, чтобы дать вам нужный вам результат. Не беспокойтесь о выходе с "\" в нем - если вы распечатаете его с помощью cat, вы увидите, как они исчезнут.

Это работает для вас?