通过将每个文件中的数据存储为List中的数据框,我已经阅读了一系列332文件,如下所示。
files <- list.files()
data <- list()
for (i in 1:332){
data[[i]] = read.csv(files[[i]])
}
数据有3列,名称为id,city,town。现在我需要计算城市下所有值的平均值,对应于我为其编写下面代码的id值1:10
for(j in 1:10){
req.data <- data[[j]]$city
}
mean(na.omit(req.data))
但它给了我一个错误的值,当我在一个函数中调用它时,它传递空值。任何帮助都非常感谢。
答案 0 :(得分:0)
每次遍历j = 1:10
时,都会将data[[j]]$city
分配给对象req.data
。这样做时,对于步骤j = 2:10
,您使用req.data
数据集的内容覆盖以前版本的j
。因此,req.data
只能在任何时候包含一个city
个数据,因此您得到的答案是错误的,因为您只计算了上一个城市的平均值,而不是全部10个。 / p>
另请注意,您可以mean(req.data, na.rm = TRUE)
删除NA
。
您可以使用lapply()
在用户R级别没有显式循环的情况下执行此操作,例如,使用虚拟数据,
set.seed(42)
data <- list(data.frame(city = rnorm(100)),
data.frame(city = rnorm(100)),
data.frame(city = rnorm(100)))
mean(unlist(lapply(data, `[`, "city")), na.rm = TRUE)
给出了
> mean(unlist(lapply(data, `[`, "city")), na.rm = TRUE)
[1] -0.02177902
所以在你的情况下,你需要:
mean(unlist(lapply(data[1:10], `[`, "city")), na.rm = TRUE)
如果你想写一个循环,那么也许
req.data <- vector("list", length = 3) ## allocate, adjust to length = 10
for (j in 1:3) { ## adjust to 1:10 for your data / Q
req.data[[j]] <- data[[j]]$city ## fill in
}
mean(unlist(req.data), na.rm = TRUE)
> mean(unlist(req.data), na.rm = TRUE)
[1] -0.02177902
是一种方式。或者,计算各个城市的平均值,然后平均这些均值
vec <- numeric(length = 3) ## allocate, adjust to length = 10
for (j in 1:3) { ## adjust to 1:10 for your question
vec[j] <- mean(data[[j]]$city, na.rm = TRUE)
}
mean(vec)