【问题标题】:How to split strings into new rows while maintaining other columns in R [duplicate]如何在保留R中的其他列的同时将字符串拆分为新行[重复]
【发布时间】:2020-03-27 14:25:47
【问题描述】:

我想在这个可重现的示例中将字符向量列拆分为多行(同一数据帧的),同时保留其他列 (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

【问题讨论】:

    标签: r dataframe strsplit


    【解决方案1】:

    更简单的选择是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))
    

    【讨论】:

    • 完美运行,谢谢!我应该澄清一下,我在整个数据集中有多个分隔符,但这很容易在你的第一个示例中使用 sep 参数修复:separate_rows(dat, ID, sep="(,|;)") if both "," 和 ";"是分隔符(例如),或者在您的第二个示例中为 stack(setNames(strsplit(dat$ID, "(,|;)"), dat$keep))
    • @Dylan_Gomes 是的,有多个分隔符,sep="[,;]"
    • 我正在等待 SO 让我接受。你的回答太快了;)
    猜你喜欢
    • 2021-10-20
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2015-08-01
    相关资源
    最近更新 更多