我有非常大的表(3000万行),我想加载为R中的数据帧 read.table()有很多方便的功能,但似乎实现中有很多逻辑会减慢速度.在我的情况下,我假设我提前知道列的类型,表不包含任何列标题或行名称,并且没有任何我必须担心的病态字符.
我知道在表格中阅读作为列表使用scan()可能非常快,例如:
datalist <- scan('myfile',sep='\t',list(url='',popularity=0,mintime=0,maxtime=0)))
Run Code Online (Sandbox Code Playgroud)
但是我将此转换为数据帧的一些尝试似乎将上述性能降低了6倍:
df <- as.data.frame(scan('myfile',sep='\t',list(url='',popularity=0,mintime=0,maxtime=0))))
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法呢?或者很可能完全不同的方法来解决问题?
......关于执行时间和/或记忆.
如果不是这样,请使用代码段进行证明.请注意,矢量化的加速不计算在内.增速必须来自apply(tapply,sapply,...)本身.
文件说
vapply类似于sapply,但具有预先指定的返回值类型,因此使用起来更安全.
你能详细说明为什么它通常更安全,可能提供例子吗?
PS:我知道答案,我已经倾向于避免sapply.我只希望在这里有一个很好的答案,所以我可以指出我的同事.请不要"阅读手册"的答案.
我们希望将数组中的所有值设置为负值.我尝试了很多东西,但还没有找到一个有效的解决方案.我想到了一个带有条件的for循环,但这似乎不起作用.
#pred_precipitation is our array
pred_precipitation <-rnorm(25,2,4)
for (i in nrow(pred_precipitation))
{
if (pred_precipitation[i]<0) {pred_precipitation[i] = 0}
else{pred_precipitation[i] = pred_precipitation[i]}
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的提示!
使用R,我尝试在按年份和城市构建的数据集中匹配人名.由于一些拼写错误,无法进行精确匹配,因此我尝试使用agrep()来模糊匹配名称.
数据集的样本块结构如下:
df <- data.frame(matrix( c("1200013","1200013","1200013","1200013","1200013","1200013","1200013","1200013", "1996","1996","1996","1996","2000","2000","2004","2004","AGUSTINHO FORTUNATO FILHO","ANTONIO PEREIRA NETO","FERNANDO JOSE DA COSTA","PAULO CEZAR FERREIRA DE ARAUJO","PAULO CESAR FERREIRA DE ARAUJO","SEBASTIAO BOCALOM RODRIGUES","JOAO DE ALMEIDA","PAULO CESAR FERREIRA DE ARAUJO"), ncol=3,dimnames=list(seq(1:8),c("citycode","year","candidate")) ))
Run Code Online (Sandbox Code Playgroud)
整洁的版本:
citycode year candidate
1 1200013 1996 AGUSTINHO FORTUNATO FILHO
2 1200013 1996 ANTONIO PEREIRA NETO
3 1200013 1996 FERNANDO JOSE DA COSTA
4 1200013 1996 PAULO CEZAR FERREIRA DE ARAUJO
5 1200013 2000 PAULO CESAR FERREIRA DE ARAUJO
6 1200013 2000 SEBASTIAO BOCALOM RODRIGUES
7 1200013 2004 …Run Code Online (Sandbox Code Playgroud) 我对R来说相当新,有一件令我印象深刻的事情是它的运行速度相当慢.有没有优化R的文档?例如,优化Python 在这里描述得非常好.在我的特定情况下,我有兴趣优化R批处理作业.
我当然尝试使用谷歌搜索,但谷歌的R信息并不容易,因为R是一个非常通用的小搜索模式.
我有一段代码,总耗时约为30秒,下面的代码大约是27秒.我将违规代码缩小到这个:
d$dis300[i] <- h
Run Code Online (Sandbox Code Playgroud)
所以我换到另一件,现在工作得非常快(正如预期的那样).
我的问题是为什么这对第二个太慢了.数据DF约为7500x18变量
第一:( 27秒过去了)
d$dis300 <- 0
for (i in 1:netot) {
h <- aaa[d$ent[i], d$dis[i]]
if (h == 0) writeLines(sprintf("ERROR. ent:%i dis:%i", d$ent[i], d$dis[i]))
d$dis300[i] <- h
}
Run Code Online (Sandbox Code Playgroud)
第二:(0.2秒过去了)
d$dis300 <- 0
for (i in 1:netot) {
h <- aaa[d$ent[i], d$dis[i]]
if (h == 0) writeLines(sprintf("ERROR. ent:%i dis:%i", d$ent[i], d$dis[i]))
foo[i] <- h
}
d$foo <- foo
Run Code Online (Sandbox Code Playgroud)
你可以看到两者都是"相同的",但有一个人有这个DF而不是一个向量.
任何评论都非常感谢.我来自另一种语言,这让我疯了一会儿.至少我有解决方案,但我希望将来能够防止这类问题.
谢谢你的时间,
我有一个大文本向量我想搜索特定的字符或短语.正则表达式将永远存在.我该如何快速搜索?
样本数据:
R <- 10^7
garbage <- replicate( R, paste0(sample(c(letters[1:5]," "),10,replace=TRUE),collapse="") )
Run Code Online (Sandbox Code Playgroud) 早上好,
我在R中开发了几个月,我必须确保代码的执行时间不会太长,因为我分析了大数据集.
因此,我一直在尝试使用尽可能多的矢量化函数.
但是,我仍然想知道一些事情.
R中代价高昂的不是循环本身吗?我的意思是,当您开始在循环中修改变量时出现问题,例如是否正确?
因此我在思考,如果你只需要在每个元素上运行一个函数(你实际上并不关心结果)会怎么样.例如,在数据库中写入数据.你该怎么办?
1)使用mapply而不将结果存储在任何地方?
2)在向量上做一个循环,只对每个元素应用f(i)?
3)我可能错过了更好的功能吗?
(当然假设你的功能没有最佳矢量化).
foreach包裹怎么样?您是否通过使用它获得了任何性能提升?
我经常面对的数据有太多的分类变量,无法令人满意地绘制到一个图上.当出现这种情况时,我会写一些东西来循环变量并保存几个特定于该变量的图.
以下示例说明了此过程:
library(tidyr)
library(dplyr)
library(ggplot2)
mtcars <- add_rownames(mtcars, "car")
param<-unique(mtcars$cyl)
for (i in param)
{
mcplt <- mtcars %>% filter(cyl==i) %>% ggplot(aes(x=mpg, y=hp)) +
geom_point() +
facet_wrap(~car) +
ggtitle(paste("Cylinder Type: ",i,sep=""))
ggsave(mcplt, file=paste("Type",i,".jpeg",sep=""))
}
Run Code Online (Sandbox Code Playgroud)
每当我看到在线参考循环时,每个人似乎总是表明循环通常不是R中的好策略.如果是这种情况,任何人都可以推荐一种更好的方法来实现与上面相同的结果吗?我特别感兴趣的是像SOOOO这样的循环更快的东西.但也许解决方案是这是最好的解决方案.如果有人能改进这一点,我只是很好奇.
提前致谢.
r ×10
apply ×2
loops ×2
optimization ×2
r-faq ×2
agrep ×1
dataframe ×1
for-loop ×1
fuzzy ×1
ggplot2 ×1
if-statement ×1
import ×1
performance ×1
rcpp ×1