我们可以通过list 的lengths 从strsplit 输出replicate 'column_1',然后执行paste
lst1 <- strsplit(df$column_2, ",")
paste0(rep(df$column_1, lengths(lst1)), unlist(lst1))
#[1] "Aw" "Ax" "Bz" "Cq" "Cr" "Cs"
注意:以上是矢量化方法,因为我们没有循环通过 list
或者使用stack从list然后paste创建一个两列data.frame
do.call(paste0, stack(setNames(lst1, df$column_1))[2:1])
#[1] "Aw" "Ax" "Bz" "Cq" "Cr" "Cs"
stack使用两列 data.frame 方法可能比第一种方法效率低一些
或者使用tidyverse,将“column_2”拆分为长格式,使用separate_rows,然后将unite两列和pull拆分为vector
library(tidyverse)
df %>%
separate_rows(column_2) %>%
unite(newcol, column_1, column_2, sep="") %>%
pull(newcol)
#[1] "Aw" "Ax" "Bz" "Cq" "Cr" "Cs"
OP 方法中的问题是基于strsplit 输出是list 的vectors 的事实。我们需要一个函数将list (lapply/sapply/vapply) 或unlist list 循环到vector 而replicating the 'column_1' (在length 期间生成lengthing)
数据
df <- structure(list(column_1 = c("A", "B", "C"), column_2 = c("w,x",
"z", "q,r,s")), class = "data.frame", row.names = c(NA, -3L))