使用for循环将几个向量组合成一个向量

时间:2014-05-13 16:08:48

标签: r for-loop vector concatenation

我有一个问题。我一直试图在互联网上搜索答案,但找不到我要找的答案:

作业:我需要遍历几个文件(由用户指定),提取一列csv文件并将它们“粘合”在一起,最后计算指定文件的平均值< / p>

问题

for (i in 1:whatever) {
monitors <- read.csv(list[i], header=T)

所以,我在这里读到文件

cols <- mons[[pollutant]]    

这里我的'不干净'矢量(包括NA)和列的值

result[i] <- c(cols)
}
return(result)
}

我的问题就出现了:我在上面按照数字启动了返回,每当我尝试使用colsresult[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添加到我的结果向量中?

3 个答案:

答案 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)
  • 你必须构建一个.csv文件的字符向量,以便读入R:

您可以通过组合功能来实现:

intersect() 
paste() 
sprintf()
list.files() 
  • 阅读.csv文件的内容并将其放入data.frame

您可以通过组合功能来实现:

ldply()
fread()

您不需要for循环来完成任务。

从那以后,您应该能够对列进行子集并计算平均值。 希望它有所帮助。