从csv文件列表中检索特定列以在R中创建数据数据帧

时间:2013-05-01 15:03:48

标签: r

我有一种情况,我需要从每个csv文件中获取一个列(或一个变量)(总文件数= 40),我的最终结果应该有一个包含相同变量的40列的数据帧。 我使用这个网站尝试了我的水平,这是我到目前为止所做的:

$#*******************************************
theFiles <- list.files(pattern=glob2rx('*.csv'))
datafile<- lapply(theFiles,read.csv, header= T, sep = ",")

rain<- vector()
head(theFiles)
All<- for (i in 1:length(datafile)) {
  #do stuff here
  data_from_csv <- as.data.frame(datafile[i])
  rain <- list(rain, data_from_csv[,8]) 
# extract column no 8 from each file 
# if i use vector then its producing only one 
} 
#*****************************$

结果是一个列表(列表(...等值,结构和名称等除了值之外没有必要。我无法检查维度,因为它是一个列表而我无法' t更改为数据帧,因为只有2个列表出现,尽管我有40个文件。 因此,我要求你们所有人解决这个烂摊子。 进入不同列的原因是它们来自不同的位置。

干杯

5 个答案:

答案 0 :(得分:5)

read.csv.sql包中尝试sqldf功能。它允许您直接从csv文件中选择特定列。

data <- read.csv.sql(theFile, sql="select col8 from file")

答案 1 :(得分:2)

试试这个:

rain<- list()

All <- for (i in 1:length(datafile)) {
  #do stuff here
  rain[[i]] <- datafile[[i]][,8]
# extract column no 8 from each file 
# if i use vector then its producing only one 
} 

答案 2 :(得分:1)

您可以对sapply对象使用datafile,如下所示:

as.data.frame( sapply( datafile , `[` , 8 ) )

或者你甚至可以回到你的文件列表并按照这样做:

as.data.frame( sapply( theFiles , function(x) ( read.csv( x , h = T ) )[,8] ) )

如果导入的列具有不同的长度

,该怎么办?

这取决于您要如何填写NA。一种天真的方法是找到最长导入列的长度,然后通过在末尾添加NA来使所有较短的列与其长度匹配。这很可能不是你想要的,但万一你可以这样做:

cols <- sapply( theFiles , function(x) ( read.csv( x , h = T ) )[,8] )
mx <- max( sapply( cols , length ) )
as.data.frame( sapply( cols , function(x) { if( length( x ) == mx ) x else  c( x , rep( NA , mx - length(x) ) ) } ) )

答案 3 :(得分:0)

使用lapply然后循环似乎对我来说有点乱。在一个循环中读取所有内容更容易(也同样快):

theFiles <- list.files(pattern=glob2rx('*.csv'))

rain <- list()
for (file in theFiles) {
    d <- read.csv(file, header = TRUE, sep = ",")
    rain[[i]] <- d[,8]
}

如前所述,你也可以使用工具只读第8列(例如使用sqldfLaFcolbycol),但我只会在有内存时执行此操作速度问题。

答案 4 :(得分:0)

theFiles <- list.files(pattern=glob2rx('*.csv'))

#read the files 
datafile<- lapply(theFiles,read.csv, header= T, sep = ",")
head(theFiles)
name<- data.frame(theFiles)
rowseq <- seq_len( max(vapply(datafile,nrow, integer(1))))
keylist <- lapply(datafile,function(x) { x[[8]][rowseq]  }) #row number 8
names(keylist) <- paste(name,theFiles,sep="_") # name the column by file names
Rainfall<- do.call(data.frame,keylist)

但是,假设所有文件都包含相等的no。时间序列。对于不等于no的系列,我们可以修改simmons代码.......

谢谢大家...... 坎杜