用列表填充矩阵,其中列表中的每个向量可能是 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, '; ')]
说我有一些';'向量中的分离信息,我想使用 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, '; ')]