我需要一个简短的R脚本,可以将大型矩阵和data.frames重组为3列data.frames。我当前的脚本可以处理矩阵,但在输入data.frame时会返回错误消息。关于如何强制它处理这两个类的任何建议?
library(FD)
ds<-dummy$abun #a matrix
#reorganize into 3 column data.frame
q<-rep.int(row.names(ds),ncol(ds))
p<-rep(colnames(ds),each = (nrow(ds)))
ssf<-data.frame(q,p,as.numeric(ds))
names(ssf) <- c("site", "species", "freq")
工作正常,但我希望它能够重新组织矩阵和数据帧(即)
ds<-as.data.frame(dummy$abun) #a matrix
#reorganize into 3 column data.frame
q<-rep.int(row.names(ds),ncol(ds))
p<-rep(colnames(ds),each = (nrow(ds)))
ssf<-data.frame(q,p,as.numeric(ds))
names(ssf) <- c("site", "species", "freq")
返回
'Error in data.frame(q, p, as.numeric(ds)) : (list) object cannot be coerced to type 'double'
答案 0 :(得分:1)
两点:
虽然as.numeric
会从matrix
创建一个简单的向量,但对于data.frame
,它不会做同样的事情。 data.frame
是list
个向量,而matrix
是具有维度属性的向量。因此,另一种方法是首先使用unlist
:
as.numeric(unlist(ds, use.names = FALSE))
看起来你实际上只是想创建一个“长”形式的数据。在这种情况下,请从基础R中探索stack
,从“reshape2”中探索melt
。可能的方法是:
out <- cbind(rownames(ds), stack(as.data.frame(ds)))
names(out) <- c("vector", "of", "names") ## Replace as required :)
或
library(reshape2)
out <- melt(as.matrix(ds))