我有以下功能,跟踪没有。在不同的日子里由城市和城镇中的人管理的里程数。我有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和其他类似函数来循环来解决这个问题
答案 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)
}
}
保存您未使用的阅读文件。