用列表填充矩阵,其中列表中的每个向量可能是 1 - 7 个元素 [R]

populating a matrix with a list, where each vector in the list may be 1 - 7 elements [R]

说我有一些';'向量中的分离信息,我想使用 strsplit 将其分开。 data 包含如下所示的信息:

[1] "k__Fungi; p__Ascomycota; c__Eurotiomycetes; o__unidentified; f__unidentified; g__unidentified; s__Eurotiomycetes sp"
[2] "k__Fungi; p__Basidiomycota; c__Agaricomycetes; o__Agaricales; f__Mycenaceae; g__unidentified; s__Mycenaceae sp"     
[3] "k__Fungi; p__Ascomycota"                                                                                            
[4] "None"                                                                                                               
[5] "k__Fungi; p__Glomeromycota; c__Glomeromycetes; o__Glomerales; f__Glomeraceae; g__Glomus; s__Glomus macrocarpum"     
[6] "k__Fungi; p__Basidiomycota; c__Agaricomycetes; o__Agaricales; f__Inocybaceae; g__Inocybe"                           

我用strsplit来分离出这样的信息:

list<- strsplit(data,split=";")

其输出为

[[1]]
[1] "k__Fungi"              " p__Ascomycota"        " c__Eurotiomycetes"    " o__unidentified"      " f__unidentified"      " g__unidentified"      " s__Eurotiomycetes sp"

[[2]]
[1] "k__Fungi"           " p__Basidiomycota"  " c__Agaricomycetes" " o__Agaricales"     " f__Mycenaceae"     " g__unidentified"   " s__Mycenaceae sp" 

[[3]]
[1] "k__Fungi"       " p__Ascomycota"

[[4]]
[1] "None"

[[5]]
[1] "k__Fungi"               " p__Glomeromycota"      " c__Glomeromycetes"     " o__Glomerales"         " f__Glomeraceae"        " g__Glomus"             " s__Glomus macrocarpum"

[[6]]
[1] "k__Fungi"           " p__Basidiomycota"  " c__Agaricomycetes" " o__Agaricales"     " f__Inocybaceae"    " g__Inocybe"      

然后我想将此信息推送到一个矩阵中,该矩阵的格式为原始数据对象的长度和 7 个命名列。我生成一个这样的空矩阵:

out<- matrix(nrow=(length(data)),ncol=7)
colnames(out)<-c("kingdom","phylum","class","order","family","genus","species")

空矩阵最终看起来像这样:

     kingdom phylum class order family genus species
[1,]      NA     NA    NA    NA     NA    NA      NA
[2,]      NA     NA    NA    NA     NA    NA      NA
[3,]      NA     NA    NA    NA     NA    NA      NA
[4,]      NA     NA    NA    NA     NA    NA      NA
[5,]      NA     NA    NA    NA     NA    NA      NA
[6,]      NA     NA    NA    NA     NA    NA      NA

然后我想将 list 中的信息插入到矩阵中,这样如果列表中的第一个向量有 7 个元素,则第 1 行中的所有 7 列都将有条目。但是,如果列表中的向量只有两个元素,则只有该矩阵行中的前两列会有条目,其余的将保留为 NA 个值。

**注意:我有意避免 for 循环。我有一个 for 循环解决方案,但是当我扩展到包含 100,000 行的数据集时它失败了。

你可以试试

library(stringi)
m1 <- stri_list2matrix(list, byrow=TRUE)
colnames(m1) <- c("kingdom","phylum","class","order","family","genus","species")

或者不使用strsplit,直接用read.table

读取
read.table(text=data, sep=";", fill=TRUE, stringsAsFactors=FALSE, na.strings='')

或者使用开发版data.table

library(data.table)#v1.9.5+
setDT(list(data))[,tstrsplit(V1, '; ')]