修剪大数据

时间:2013-07-19 13:46:11

标签: r bigdata trim

我正在研究this other posting上所述的类似问题,并尝试调整代码以选择我感兴趣的列并使其适合我的数据文件。

然而,我的问题是生成的文件比原始文件大,我不确定代码是否按照我的意图运行。

当我使用SPSS打开时,数据集似乎占据了标题行,然后在没有第二行结束的情况下创建了数百万份副本(我必须强制停止该过程)。

我注意到while循环中没有指定行的计数器,可能是这种情况吗?我使用R编程的背景非常有限。该文件是.csv,是4.8GB,包含329个变量和数百万行。我只需要保留大约30个变量。

这是我使用的代码:

##Open separate connections to hold cursor position

file.in <- file('npidata_20050523-20130707.csv', 'rt')
file.out<- file('Mainoutnpidata.txt', 'wt')
line<-readLines(file.in,n=1)
line.split <-strsplit(line, ',')

##Column picking, only column 1

cat(line.split[[1]][1:11],line.split[[1]][23:25], line.split[[1]][31:33], line.split[[1]][308:311], sep = ",", file = file.out, fill= TRUE)

##Use a loop to read in the rest of the lines
line <-readLines(file.in, n=1)
while (length(line)){
    line.split <-strsplit(line, ',')
if (length(line.split[[1]])>1) {
        cat(line.split[[1]][1:11],line.split[[1]][23:25], line.split[[1]][31:33], line.split[[1]][308:311],sep = ",", file = file.out, fill= TRUE)
    }
}
close(file.in)
close(file.out)

1 个答案:

答案 0 :(得分:1)

有一件事是错误的,它会在你的while循环中错过lines <- readLines(file.in, n=1)。你现在陷入无限循环。此外,一次只读一行将会非常慢。

如果在您的文件中(与您链接的示例中的那个不同),每行包含相同数量的列,您可以使用我的LaF包。这应该导致以下内容:

library(LaF)
m <- detect_dm_csv("npidata_20050523-20130707.csv", header=TRUE)
laf <- laf_open(m)
begin(laf)
con <- file("Mainoutnpidata.txt", 'wt')
while(TRUE) {
  d <- next_block(laf, columns = c(1:11, 23:25, 31:33, 308:311))
  if (nrow(d) == 0) break;
  write.csv(d, file=con, row.names=FALSE, header=FALSE)
}
close(con)
close(laf)

如果您的30列符合内存,您甚至可以这样做:

library(LaF)
m <- detect_dm_csv("npidata_20050523-20130707.csv", header=TRUE)
laf <- laf_open(m)
d <- laf[, c(1:11, 23:25, 31:33, 308:311)]
close(laf)

我无法在您的文件上测试上面的代码,因此无法保证没有错误(如果有,请告诉我)。