0

我需要一个简短的 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'
4

1 回答 1

1

两点:

  1. 虽然as.numeric会从 a 创建一个简单的向量matrix,但它不会对 a 做同样的事情data.frame。Adata.frame是一个list向量,而amatrix是一个具有维度属性的向量。因此,一种替代方法是首先使用unlist

    as.numeric(unlist(ds, use.names = FALSE))
    
  2. 看起来您实际上只是在尝试创建数据的“长”形式。在这种情况下,stack从基础 R 和melt“reshape2”进行探索。一种可能的方法是:

    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))
    
于 2013-09-11T13:05:48.017 回答