尽管平均功能的有效值,但返回NA

时间:2014-07-17 09:22:29

标签: r

我有以下功能,跟踪没有。在不同的日子里由城市和城镇中的人管理的里程数。我有3列。 Id(一个人)城市镇。对于Id的相同值,如果没有运行里程,则在城市和城镇或NA中具有不同的里程值。因此,我可以在多行中具有Id = 1,其中城市和城镇的值对应于Id = 1,并且类似地对于Id = 2,依此类推。我有500个csv文件,每个Id一个,现在我需要计算ID的平均值和组合,以下是我的功能。

milesmean <- function(directory, place, id = 1:500){
  if(directory == "miledata"){
    files <- list.files()
    data <- list()
    for (i in 1:500){
      data[[i]] = read.csv(files[[i]])
    }
    req.data <- vector("list", length = length(id))
    for(j in id){
      req.data[[j]] <- data[[j]]$place
    }
    mean(unlist(req.data), na.rm=TRUE)
  }

}

但是当我打电话给里程(&#34; miledata&#34;,&#34; city&#34;,1:10)时,我会得到NA作为价值和警告信息

Warning message:
In mean.default(unlist(req.data), na.rm = TRUE) :
  argument is not numeric or logical: returning NA

有什么理由? TIA。注意:我需要通过不使用lapply和其他类似函数来循环来解决这个问题

1 个答案:

答案 0 :(得分:2)

该行:

req.data[[j]] <- data[[j]]$place

正在寻找一个名为“地点”的专栏。在导入的data.frame中。如果您希望使用参数place中提供的值,则需要将其更改为:

req.data[[j]] <- data[[j]][[place]]

由于没有名为&#39; place&#39;数据变成了一个NULL列表,这些列表在未列出时形成一个NULL,这就是导致警告平均功能的原因。

你也可以删掉第一个循环,然后留下:

milesmean <- function(directory, place, id = 1:500){
  if(directory == "miledata"){
    files <- list.files()
    req.data <- vector("list", length = length(id))
    for(j in seq_along(id)){
      req.data[[j]] <-read.csv(files[[id[j]]])[[place]]
    }
    mean(unlist(req.data), na.rm=TRUE)
  }
}

保存您未使用的阅读文件。