R:来自数据帧的平均子集序列

时间:2015-04-21 12:42:04

标签: r

我已经面临三天的问题了,我无法得到任何关于它为什么不起作用的答案。我尝试了很多不同的方法,但我只想发布一个我认为可能最接近解决方案的方法。我将简要介绍一下我想问的问题。

我在名为" Myfolder &#34的文件夹中有 7个csv文件(称为001.csv,002.csv,...等) ;。 我一直在尝试使用 for-loop将功能 合并添加到唯一的 data.frame 所有这些不同的.csv文件中和r.bind ,最后返回来自任何一列" Colour1"的意思或" Colour2"取决于"颜色" (专栏)和"儿童" (行)我选择,当然没有错过价值" Na"。作为一个例子,当我合并文件时,我得到一个像这个数据框的数据框:

         Colour1  Colour2   Children    
            NA     NA         1
            9      NA         2
            NA     NA         2
            NA     5          3
            7      NA         4
            NA     NA         5
            NA     8          5
            2      NA         6
            6      3          6
            14     NA         7

这是我要构建的函数的示例 get_mean< - function(目录,颜色,子项)

我尝试了什么

    get_mean <- function(directory, colour, children) {
      files <- list.files(directory, full.names=TRUE)
      allfiles <- data.frame()
      for(i in 1:7) {
            allfiles <- rbind(allfiles, read.csv(files[i]))
      }
      if(colour == "colour1"){
            mean(allfiles$colour1[allfiles$Children == children], na.rm = TRUE)
      }
      if(colour == "colour2"){
            mean(alllists$colour2[alllist$Children == children], na.rm = TRUE)
      }      
}

当我尝试例如:

get_mean("Myfolder", "colour1", 3:6)

我得到了

In alllist$ID == id :
  longer object length is not a multiple of shorter object length

当我尝试时:

get_mean("Myfolder", "colour1", 6)

我明白了:

> 

是的伙计......我绝对没有回来。

你觉得伙计们怎么样?对它进行任何修正?任何其他方式来获得平均值?

注意:我在这里放的所有数据都不是我正在使用的数据。这只是一个更大的练习的例子。我试图用不同的名字和数字做一个非常小的例子,以便不讨论练习本身,而其他人可以复制解决方案

1 个答案:

答案 0 :(得分:1)

以下是您的功能的更正且更具可读性的版本 - 我将data.frame所有文件命名为df,我还添加了对colour的检查:

get_mean <- function(directory, colour, children) {

    files = list.files(directory, full.names=T)

    df = do.call(rbind, lapply(files[1:7], read.csv))

    # check the colour argument
    if(!is.element(colour, c('colour1','colour2'))) 
      stop(sprtinf('colour argument value %s is not part of df column', colour))

    mean(df[[colour]][df$Children == children], na.rm=TRUE)   

}