我有vegan
函数specaccum
的一些输出。它是一个包含8个不同长度对象的列表;
> str(SPECIES)
List of 8
$ call : language specaccum(comm = PRETEND.DATA, method = "rarefaction")
$ method : chr "rarefaction"
$ sites : num [1:5] 1 2 3 4 5
$ richness : num [1:5] 20.9 34.5 42.8 47.4 50
$ sd : num [1:5] 1.51 2.02 1.87 1.35 0
$ perm : NULL
$ individuals: num [1:5] 25 50 75 100 125
$ freq : num [1:50] 1 2 3 2 4 3 3 3 4 2 ...
- attr(*, "class")= chr "specaccum"
我想提取三个列表('丰富',' sd'和'个人')并将它们转换为数据框中的列。我已经开发了一种解决方法;
SPECIES.rich <- data.frame(SPECIES[["richness"]])
SPECIES.sd <- data.frame(SPECIES[["sd"]])
SPECIES.individuals <- data.frame(SPECIES[["individuals"]])
SPECIES.df <- cbind(SPECIES.rich, SPECIES.sd, SPECIES.individuals)
但这看起来很笨拙和旷日持久。我想知道是否有人可以提出更整洁的解决方案? (我应该用lapply看某事吗?)谢谢!
生成specaccum
输出的示例数据;
Set.Seed(100)
PRETEND.DATA <- matrix(sample(0:1, 250, replace = TRUE), 5, 50)
library(vegan)
SPECIES <- specaccum(PRETEND.DATA, method = "rarefaction")
答案 0 :(得分:1)
我们可以在vector
中连接名称并将其解压缩
SPECIES.df <- data.frame(SPECIES[c("richness", "sd", "individuals")])
答案 1 :(得分:0)
另一种类似于akrun的替代方案是:
ctoc1 = as.data.frame(cbind(SPECIES $ richness,SPECIES $ sd,SPECIES $ persons))
请注意,在这两种情况下(我的答案和akrun)如果列的长度不匹配,您将收到错误。
例如:SPECIES.df&lt; - data.frame(SPECIES [c(&#34; sd&#34;,&#34; freq&#34;)])
data.frame中的错误(richness = c(20.5549865665613,33.5688503093388,41.4708434700877,:
参数意味着不同的行数:7,47
如果是这样,请记住使用length()函数:
length(SPECIES $ sd)&lt; -47#这将添加NAs以增加列长度。
SPECIES.df&lt; - data.frame(SPECIES [c(&#34; sd&#34;,&#34; freq&#34;)])
SPECIES.df#dataframe有2列7行。