我在R中有一个包含9列和1600万行的矩阵a
。第4列中的每个元素都是“Apple”或“Lion”。
我想把那些第4列中有“Apple”条目的行收集起来,并按照第一列中的整数条目排序,形成一个“新”的矩阵。
最好的方法是什么?输出将是一个.csv文件,因为在R中查看这个矩阵是不可能的(1600万行!)。
我试了两个代码:
1) 在这个代码中,首先我引入一个9维向量b
,所有元素都是零。然后我运行一个for
循环,检查a
中的每一行是否第四个元素是“Apple”。如果是,那么这一行就被添加到b
中,b
也随之增长。最后,我使用order函数对b
进行排序。
b=rep(0,9)
for(i in 1:nrow(a)){
if(a[i,4]=="Apple"){
b=rbind(b,a[i,])
}
}
b=order(b)
write.table(b,"Apple.csv",sep=",",append=TRUE,col.names=FALSE)
这段代码似乎无法正常工作,因为for循环运行时间过长!!
2) 我运行了一个for循环,检查 a
中每一行的第四个条目是否为 "Apple"。如果是,则将该行打印到 .csv 文件中。因此,在 R 中不会创建矩阵。在完成后,将读取该 .csv 文件,并使用 as.integer
函数将第一列转换为整数条目,再使用 order
函数对表格进行排序。
for(i in 1:nrow(a)){
if(a[i,4]=="Apple"){
write.table(a[i,],"Apple.csv",sep=",",append=TRUE,col.names=FALSE)
}
}
a=read.csv("Apple.csv")
a[,1]=as.integer(a[,1])
a=order(a)
这似乎可以工作,尽管在我的笔记本电脑上速度很慢。按照目前的速度,for循环将需要5天才能完成。我不知道我的4GB内存的笔记本电脑是否本质上无法处理如此大的数据集。
有哪些方法可以优化代码?这个过程的最有效代码是什么?如果有人指点我正确的方向,我会很高兴。