gpt4 book ai didi

r - 如何在R中更有效地拾取和排序?

转载 作者:行者123 更新时间:2023-12-01 07:25:04 26 4
gpt4 key购买 nike

我有一个矩阵 a由 R 中的 9 列和 1600 万行组成。第 4 列中的每个元素是“Apple”或“Lion”。

我想将在第 4 列中具有条目“Apple”的那些行收集在一起,并根据第一列中的整数条目对这个"new"矩阵进行排序。

执行此操作的最佳方法是什么?当然,输出将是一个 .csv 文件,因为不可能在 R 中查看这个矩阵(1600 万行!!)。

我尝试了两个代码:

1)在这段代码中,我首先引入了一个9维向量b全为零。然后我运行一个 for检查是否在 a 的每一行中的循环,第四个元素是“苹果”。如果是,则将该行添加到 b ,这样,b成长。最后我排序 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中每行的第四个条目是否存在是“苹果”。如果是这样,它将将该行打印到 .csv 文件。所以没有在 R 中创建矩阵。这个 .csv 文件将在完成后和通过 as.integer 转换第一列后读入 R。函数到整数条目,我使用 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 天才能完成。我不知道我的具有 4 GB RAM 的笔记本电脑是否本质上无法处理如此庞大的数据集。

我可以通过哪些方式优化代码?这个过程最有效的代码是什么?如果有人指出我正确的方向,我会很高兴。

最佳答案

这是使用另一个名为 data.table 的流行软件包的替代答案. DT 就像数据框,但实际上,在设计上更接近 SQL

library(data.table)

DT <- as.data.table(matrix(data = NA, nrow = 20000000, ncol = 9))
DT$V4 <- sample(c("Apple","Lion"), size = 20000000, replace = TRUE, prob = c(0.5, 0.5) )
DT$V9 <- rnorm(20000000, mean = 0, sd = 1000)

str(DT)

setkey(DT, V9)

system.time( r <- setorder( DT[V4 == "Apple"], V9 ) )
str(r)

tables()

在我的笔记本电脑上
user  system elapsed
2.35 0.30 2.64

内存使用
     NAME       NROW NCOL  MB COLS                       KEY
[1,] DT 20,000,000 9 916 V1,V2,V3,V4,V5,V6,V7,V8,V9 V9
[2,] r 9,998,016 9 420 V1,V2,V3,V4,V5,V6,V7,V8,V9 V9
Total: 1,336MB

链接: https://cran.r-project.org/web/packages/data.table/index.html
备忘单: http://blog.datacamp.com/data-table-cheat-sheet/

关于r - 如何在R中更有效地拾取和排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34477265/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com