阅读R中的一系列值

时间:2014-07-16 13:16:55

标签: r

通过将每个文件中的数据存储为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))

但它给了我一个错误的值,当我在一个函数中调用它时,它传递空值。任何帮助都非常感谢。

1 个答案:

答案 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)