我有一个问题。我一直试图在互联网上搜索答案,但找不到我要找的答案:
作业:我需要遍历几个文件(由用户指定),提取一列csv文件并将它们“粘合”在一起,最后计算指定文件的平均值< / p>
问题
for (i in 1:whatever) {
monitors <- read.csv(list[i], header=T)
所以,我在这里读到文件
cols <- mons[[pollutant]]
这里我的'不干净'矢量(包括NA)和列的值
result[i] <- c(cols)
}
return(result)
}
我的问题就出现了:我在上面按照数字启动了返回,每当我尝试使用cols
或result[i]
粘贴来自result[[i]]
的数据时,我分别得到以下错误:< / p>
for result[i]
number of items to replace is not a multiple of replacement length
for result[[i]]
more elements supplied than there are to replace
现在我意识到这与我的cols
大于我的result
有关:现在的问题是:如何设置它以便将cols添加到我的结果向量中?
答案 0 :(得分:1)
我不知道我是否理解正确,但您可以使用此代码
df <- lapply(files, read.csv, header=TRUE)
result <- unlist(lapply(df, function(x) x[["column_name"]]))
这样您就可以通过第一行读取数据并将其存储在列表中,然后在下一行中从每个data.frame获取指定列(unlist
因为lapply
将返回列表,我假设你想要一个数字向量)。由于您写道,您想要计算result
向量的平均值,我假设每个data.frame pollutant
列的类型相同。但是,如果您需要使用for
循环或者您有太多数据要将它们存储在列表中,您可以在循环之前创建一个空向量result<-numeric(0)
,然后在循环中使用results <- c(results, cols)
。
答案 1 :(得分:1)
如果你只是提取和粘合&#39;我建议使用连接函数c()
并创建vector
,而不是创建list
类型的对象。有些事情应该有效:
fnames <-c("fname1","fname2","fname3")
excol="extractedColumnName"
extractedData = c() #initialize the vector. Typing can be determined by R automatically.
for(fname in fnames){
cur <- read.csv(fname, header=T)
extractedData = c(extractedData, cur[,excol])
}
根据NAs在数据文件中的存储方式,调用na.strings = "<the string used to indicate NA>"
时可能需要read.csv
参数。如果所需的列中有字符值,则可能需要在读入所有内容后在向量上运行as.numeric()
函数。
有更高效,更加编码密集的方式来加载数据,但对于一个简单的解决方案,不处理太大的数据文件,这种方法应该可以正常工作。
PS,为了处理NAs(假设您不想以任何特殊方式对待它们),这两种方法中的一种应该有效:
1):
extractedDataNoNA = extractedData[ ! is.na(extractedData) ]
meanResult = mean(extractedDataNoNA)
! is.na(extractedData)
创建一个逻辑向量来选择extractData向量中的元素。
2):
meanResult = mean(extractedData, na.rm=TRUE)
答案 2 :(得分:0)
既然我知道这个问题来自哪里,我真的不能给你答案,但我可以指出你正确的方向。
首先,你一定要看看这些包:
library(plyr)
library(dplyr)
library(data.table)
library(lubridate)
您可以通过组合功能来实现:
intersect()
paste()
sprintf()
list.files()
您可以通过组合功能来实现:
ldply()
fread()
您不需要for循环来完成任务。
从那以后,您应该能够对列进行子集并计算平均值。 希望它有所帮助。