Как альтернативно объединить 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"
Есть ли способ сделать это? Спасибо.
5 ответов
Вы также можете использовать
c(rbind(a,b,c))
который (rbind
) объединяет три переменные в матрицу (по строкам), а затем (c()
) преобразует их обратно в вектор, используя тот факт, что R хранит матрицы в порядке столбцов.
Некоторое разнообразие ответов на этот вопрос проистекает (я думаю) из-за отсутствия ясности со стороны ОП (не знаю, является ли это вопросом понимания или коммуникации...) между объединением отдельных строк символов (например, paste("a","b")
приводит к вектору длины 1: "a b")
) и объединение векторов символьных строк (c("a","b")
приводит к вектору длины 2: "a" "b"
)
Я бы сделал это так:
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"
Это тесно связано с этим ответом.
Я думаю, что это может сработать:
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"
Вы могли бы использовать 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"
Я думаю, что вы хотите, это:
paste('\"', paste(a,b,c,sep='\",\"'), '\"', collapse='\",\"')
Вам не нужны двойные кавычки, чтобы получить ",". Внутренний paste()
делает то, что вы попробовали, то внешний paste()
объединяет все это вместе, чтобы дать вам результат, который вы хотите. Не беспокойтесь о выводе, содержащем "\", если вы распечатаете его с cat
вы увидите, как они исчезнут.
Это работает для вас?