【发布时间】:2020-11-27 14:04:00
【问题描述】:
我有一个包含不同长度字符串的向量: 向量如下例所示:
TX <- c("d_Bacteria|g_Thermobaculum", "d_Bacteria|p_Acidobacteria|c_Acidobacteria subdivision|f_Vicinamibacteraceae|g_Luteitalea", "d_Bacteria|p_Acidobacteria|c_Acidobacteriia|o_Acidobacteriales|f_Acidobacteriaceae|g_Acidobacterium", "d_Bacteria|p_Acidobacteria|c_Acidobacteriia|o_Acidobacteriales|f_Acidobacteriaceae|g_Candidatus Koribacter", "d_Bacteria|p_Acidobacteria|c_Acidobacteriia|o_Acidobacteriales|f_Acidobacteriaceae|g_Granulicella", "d_Bacteria|p_Acidobacteria|c_Acidobacteriia|o_Acidobacteriales|f_Acidobacteriaceae|g_Terriglobus")
我需要制作一个数据框来根据分类注释划分每个字符串:“domain”,“phylum”,“class”,“order”,“family”,“genus”
我试过了:
taxon <- str_split(clade_names, "\\|", simplify = T)
它可以完美地分割它,但它会从左到右填充数据框,我需要根据分类级别填充它。
我相信我需要使用grepl 来匹配“d_”、“p_”、“c_”、“o_”、“f_”、“g_”
但我不知道如何正确编写它。
非常感谢您的帮助。
【问题讨论】:
-
两个略显老套的解决方案思路: 1. 在 str_splitting 之后,您可以执行一些 if_else 命令来改变新变量等等。如“if_else(value 以 p_ 开头,则变量 p_ ... 为 value,否则 NA)”
-
2.想法:在 str_splitting 之后,您可以将数据集旋转更长的时间,根据值更改创建的“名称”列的值,然后使用 pivot_wider 将其重新整形。
-
另外,如果您能提供一个我们可以使用的最小可重现示例,而不仅仅是复制的输出,那就太好了。 stackoverflow.com/help/minimal-reproducible-example
-
我更新了我所做的代码部分,因此可以重现它。 =)
-
你可以使用我的“splitstackshape”包中的
cSplit,拆分两次。library(splitstackshape); cSplit(cSplit(as.data.table(TX)[, row := seq_along(TX)], "TX", "|", "long"), "TX", "_", "wide")[, dcast(.SD, row ~ TX_1, value.var="TX_2")]