使用相同的R脚本将矩阵和数据帧处理为3列数据帧

时间:2013-09-11 12:15:26

标签: r class matrix dataframe

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

1 个答案:

答案 0 :(得分:1)

两点:

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

    as.numeric(unlist(ds, use.names = FALSE))
    
  2. 看起来你实际上只是想创建一个“长”形式的数据。在这种情况下,请从基础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))