数据帧的平均值不在R中输出正确的值

时间:2014-05-15 03:33:48

标签: r dataframe mean

我有一个情况。我得到的意思不适合多个id,并且已经找到了解决问题的方法,但是寻找可能解决方案的指导。

我的数据位于数据框中。

  1. 我在for循环之前创建了一个数据框“b”。一个for循环来读取文件。
  2. 在for循环中,我将所有文件分配给“b”b< -c(b,data [pollutent])
  3. b的类是data.frame
  4. “b”上的名称功能显示一列,它是函数调用中为污染物提供的参数
  5. 当我返回b时,它会向我显示正确的结果,但对于多个id,它们会出现在不同的部分。例如,70:72显示

    1st
    $nitrate...underneath the values
    2nd
    $nitrate...underneath values
    3rd
    $nitrate...and values
    
  6. 问题:当我继续计算多个id的平均值时,它只考虑来自第一个文件的第一组数据。

    函数调用是A1p1("specdata","nitrate",70:72)

    我也粘贴了函数

    下面的示例输出
    $nitrate
       [1]      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA
      [11]      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA
      [21]      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA
    .............
    $nitrate
       [1]      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA
      [11]      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA
      [21]      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA
    ............
    $nitrate
       [1]      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA
      [11]      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA
      [21]      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA
    

    是否有人可以建议的补救措施?

    我正在使用的完整代码如下:

    **

    A1p1 <- function(directory,pol,id)
    {
    
      filename <- list.files(pattern=".csv")
      a <- data.frame()
    
      for( i in 1:length(id))
      {
    
        data <- read.csv(paste(directory,"/",sprintf('%03d',id[i]),".csv",sep=""),header=T)
        a <- c(a,data[pol])
    
      }
    
    
    if(pollutent=="aa")
      {
        me <- mean(a$aa,na.rm=T)
      }
      else
      {
        me <- mean(a$bb,na.rm=T)
      }
    
      return(round(me,digits=3)) 
    }
    

1 个答案:

答案 0 :(得分:0)

c()这不是组合data.frames的正确方法。你想把行堆叠在一起吗?然后rbind()是正确的功能。是否要将列添加到现有data.frame?然后cbind是正确的选择。是否要将data.frames合并为一个公共值?然后merge将是正确的功能。它根本不清楚你要对这些数据做些什么。

在这里可能不需要看看。你可以做到

mylist<-lapply(paste(directory,"/",sprintf('%03d',id[i]),".csv",sep=""), read.csv,header=T)

获取包含所有data.frames的列表,然后使用

将它们叠加在一起
do.call(rbind, mylist)

假设它们都具有相同的列名,并且是您想要的结果。