【问题标题】:Separate column into multiple rows and fill to the left, in R在R中将列分成多行并填充到左侧
【发布时间】:2023-12-07 19:57:02
【问题描述】:

我有一个很长的注释基因列表。它们以不同的级别“A”、“B”、“C”等进行注释。每个级别都有不同的名称,在某些情况下还有不同的格式。我想保持每个级别的名称不变。在 R 中,文本文档被导入为 1 列,我想将 A、B、C 和 D 行分成列。行是按顺序排列的,意思是“B Level2”列在申请A Level1类别之后,在“C Level3”类别之上。 “#”将 D 级与下一个 A 级类别分开。 所以,在每个“#”之后,我想将 A、B、C 和 D 行分隔成单独的列。然后用上面的级别类别名称填写左侧的列。 给定这个例子df:

df <- data.frame(x = c("A<b>Level1</b>", "B", "B  <b>Level2</b>", "C    02000 Level3 [BR:ko02000]", "C    02010 Level3 [PATH:ko02010]", "D      Level4; K15551  tauA; taurine transport system substrate-binding protein", "D      Level4; K15551  tauA; taurine transport system substrate-binding protein", "D      Level4; K15551  tauA; taurine transport system substrate-binding protein"))

输出需要如下所示:

A   B   C   D
A<b>Level1</b>  B  <b>Level2</b>    C    02000 Level3 [BR:ko02000]  NA
A<b>Level1</b>  B  <b>Level2</b>    C    02010 Level3 [PATH:ko02010]    D      Level4; K15551  tauA; taurine transport system substrate-binding protein
A<b>Level1</b>  B  <b>Level2</b>    C    02010 Level3 [PATH:ko02010]    D      Level4; K15551  tauA; taurine transport system substrate-binding protein
A<b>Level1</b>  B  <b>Level2</b>    C    02010 Level3 [PATH:ko02010]    D      Level4; K15551  tauA; taurine transport system substrate-binding protein

到目前为止,我正在尝试使用 dplyr 和 tidyr 来分离()输入 df,但我似乎无法让它工作。 建议??想法??

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    我建议使用使用split 创建的数据框列表:

    split(df, substr(df$x, 1, 1))
    

    如果你真的必须拥有它,你如何展示它:

    library(dplyr)
    library(tidyr)
    df %>% group_by(id = substr(x, 1, 1)) %>%
           mutate(row = row_number()) %>%
           spread(id, x) %>%
           fill(-row)
    

    【讨论】:

    • 当我在这里使用第二种解决方案时,我收到以下错误消息:“setNames(as.list(seq_along(vars)), vars) 中的错误:找不到对象'A'”
    • 它应该可以工作,但查看编辑以获得更通用的版本
    最近更新 更多