如何在维护 R 中的其他列的同时将字符串拆分为新行

How to split strings into new rows while maintaining other columns in R

我想将字符向量列拆分为多行(同一数据帧),同时在这个可重现的示例中维护其他列(keep):

dat<-structure(list(ID = c("E87", "E42", "E39", "E16,E17,E18", "E760,E761,E762"), keep = 1:5), row.names = c(NA, 5L), class = "data.frame")
> dat
              ID keep
1            E87    1
2            E42    2
3            E39    3
4    E16,E17,E18    4
5 E760,E761,E762    5

当然我们可以将 IDstrsplit 分开,但输出是列表格式(出于某种原因这总是让我感到困惑),并且没有列 keep

strsplit(dat$ID, ",")

[[1]]
[1] "E87"

[[2]]
[1] "E42"

[[3]]
[1] "E39"

[[4]]
[1] "E16"  " E17" " E18"

[[5]]
[1] "E760" "E761" "E762"

使用 unlist 我可以将此输出返回到向量中,但现在顺序肯定会丢失,以便能够将 keepID 重新组合。

unlist(strsplit(dat$ID, ","))

[1] "E87"  "E42"  "E39"  "E16"  " E17" " E18" "E760" "E761" "E762"

关于如何获得此输出的任何想法:

> dat
              ID keep
1            E87    1
2            E42    2
3            E39    3
4            E16    4
5            E17    4
6            E18    4
7            E760   5
8            E761   5
9            E762   5

更简单的选择是 separate_rows

library(tidyr)
separate_rows(dat, ID)
#    ID keep
#1  E87    1
#2  E42    2
#3  E39    3
#4  E16    4
#5  E17    4
#6  E18    4
#7 E760    5
#8 E761    5
#9 E762    5

或者使用OP的方法,拆分'ID'后,用'keep'列命名,然后stack为两列data.frame

stack(setNames(strsplit(dat$ID, ","), dat$keep))