将列分隔为多行,并向左填充,以R表示

将列分隔为多行,并向左填充,以R表示,r,dplyr,tidyr,R,Dplyr,Tidyr,我有一长串带注释的基因。它们被标注在不同的级别“A”、“B”、“C”等。每个级别有不同的名称,在某些情况下有不同的格式。我想保持每个级别的名称不变。在R中,文本文档作为1列导入,我想将A、B、C和d行分隔成列。行是按顺序排列的,表示“B级别2”列在应用程序A级别1类别和“C级别3”类别之后。“#”将D级与下一个A级分类分开。 因此,在每个“#”之后,我想将A、B、C和d行分隔成单独的列。然后用上面的级别类别名称填写左侧的列。 给出此示例: df <- data.frame(x = c("A

我有一长串带注释的基因。它们被标注在不同的级别“A”、“B”、“C”等。每个级别有不同的名称,在某些情况下有不同的格式。我想保持每个级别的名称不变。在R中,文本文档作为1列导入,我想将A、B、C和d行分隔成列。行是按顺序排列的,表示“B级别2”列在应用程序A级别1类别和“C级别3”类别之后。“#”将D级与下一个A级分类分开。 因此,在每个“#”之后,我想将A、B、C和d行分隔成单独的列。然后用上面的级别类别名称填写左侧的列。 给出此示例:

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"))

df我建议使用数据帧列表,使用
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’”它应该可以工作,但有关更一般的版本,请参阅编辑
library(dplyr)
library(tidyr)
df %>% group_by(id = substr(x, 1, 1)) %>%
       mutate(row = row_number()) %>%
       spread(id, x) %>%
       fill(-row)