我有一种情况,我需要从每个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个文件。 因此,我要求你们所有人解决这个烂摊子。 进入不同列的原因是它们来自不同的位置。
干杯
答案 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列(例如使用sqldf
,LaF
或colbycol
),但我只会在有内存时执行此操作速度问题。
答案 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代码.......
谢谢大家...... 坎杜