我们可以使用cSplit
library(splitstackshape)
cSplit(df1, "C", sep=",", "long")
# A B C
#1: a 1 e
#2: b 2 f
#3: c 3 g
#4: c 3 h
#5: c 3 i
#6: d 4 j
#7: d 4 k
或使用unnest 来自tidyr
library(tidyr)
unnest(df1, C=strsplit(C, ","))
# A B C
#1 a 1 e
#2 b 2 f
#3 c 3 g
#4 c 3 h
#5 c 3 i
#6 d 4 j
#7 d 4 k
或者base R
lst <- strsplit(df1$C, ",")
transform(df1[rep(1:nrow(df1), lengths(lst)),-3], C= unlist(lst))
# A B C
#V1 a 1 e
#V2 b 2 f
#V3 c 3 g
#V3.1 c 3 h
#V3.2 c 3 i
#V4 d 4 j
#V4.1 d 4 k
注意:如果“C”列是factor,则转换为character 并在strsplit 中使用它,即strsplit(as.character(df1$C), ",")
更新
假设如果“C”列是list,我们仍然可以使用unnest
unnest(df2, C)
# A B C
#1 a 1 e
#2 b 2 f
#3 c 3 g
#4 c 3 h
#5 c 3 i
#6 d 4 j
#7 d 4 k
或与listCol_l 来自splitstackshape
listCol_l(df2, "C")[]
数据
df1 <- structure(list(A = c("a", "b", "c", "d"), B = 1:4, C = c("e",
"f", "g,h,i", "j,k")), .Names = c("A", "B", "C"),
class = "data.frame", row.names = c("V1", "V2", "V3", "V4"))
df2 <- structure(list(A = c("a", "b", "c", "d"), B = 1:4, C = list("e",
"f", c("g", "h", "i"), c("j", "k"))), .Names = c("A", "B",
"C"), row.names = c("V1", "V2", "V3", "V4"), class = "data.frame")