2014-07-16 27 views
-1

我已经通过在List中将每个文件中的数据存储为一个数据帧来读取一系列如下所示的332个文件。在R读取一系列值

files <- list.files() 
data <- list() 
for (i in 1:332){ 
    data[[i]] = read.csv(files[[i]]) 
} 

该数据有3列,名称为id,城市,城镇。现在,我需要计算下对应的ID全市所有值的平均值为1:10,我写了下面的代码

for(j in 1:10){ 
    req.data <- data[[j]]$city 
} 
mean(na.omit(req.data)) 

但它给我一个错误的值,当我把它在一个函数其传输空值。任何帮助,高度赞赏。

回答

0

每次迭代j = 1:10时,都会将data[[j]]$city分配给对象req.data。这样做,对于步骤j = 2:10,您是覆盖req.data的前一个版本与j th数据集的内容。因此req.data在任何时候都只包含一个单独的city的数据值,因此你得到的是错误的答案。你只计算最后一个城市的平均值,而不是全部10.

另外请注意,你可以请mean(req.data, na.rm = TRUE)删除NA s。

你可以做到这一点,而不在使用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) 
+0

感谢编辑帮助我,因为我一直在寻找与循环的实现的解决方案。还有一个问题是,当我把它放入一个函数中,并将id和城市名称作为参数传递并执行时,我得到NA作为答案并且出现警告信息。警告消息: 在mean.default(unlist(req。数据),na.rm = TRUE): 参数不是数字或逻辑:返回NA任何想法可能是什么原因。 Thnx – Arin

+0

我想问一个新的问题;目前尚不清楚你的功能是什么样的,或者你是怎么称呼它的。 –