Как альтернативно объединить 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
, вы увидите, как они исчезнут.
Это работает для вас?