2

我有一种情况,我需要从每个 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 
} 
#*****************************$

结果是一个 list(list(list(...etc 的值、结构和名称,除了值之外不一定有意义。我无法检查维度,因为它是一个列表,我无法更改为数据框,因为我有40个文件,但只出现了2个列表。因此,我要求大家整理一下混乱。进入不同列的原因是它们来自不同的位置。

干杯

4

5 回答 5

5

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

data <- read.csv.sql(theFile, sql="select col8 from file")
于 2013-05-01T15:12:48.543 回答
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 
} 
于 2013-05-01T15:11:09.260 回答
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) ) ) } ) )
于 2013-05-01T15:19:06.020 回答
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),但我只会在存在内存/速度问题时这样做。

于 2013-05-01T15:21:53.377 回答
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)

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

谢谢大家...... khandu

于 2013-05-07T01:31:48.263 回答