早上好,
我在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这样的循环更快的东西.但也许解决方案是这是最好的解决方案.如果有人能改进这一点,我只是很好奇.
提前致谢.
> system.time(sapply(rnorm(1000000,0,1), function (x) round(x,2)))
user system elapsed
2.78 0.11 2.89
> system.time(round(rnorm(1000000,0,1),2))
user system elapsed
0.29 0.00 0.30
Run Code Online (Sandbox Code Playgroud)
在阅读了R提示问题的答案后,我正在尝试这个.在上述情况下,我没想到蓝色比等效复合函数慢几个数量级.有谁知道为什么会这样?如果我理解正确,那么矢量化并接近最佳速度.
我正在努力矢量化以下函数的重复应用程序,我目前已将其实现为 for 循环。这个小例子表明了较大数据集的问题,矢量化将允许有益的运行时改进:
action = function(x,y,i) {
firsttask = cumsum(x[which(x<y[i])])
secondtask = mean(firsttask)
thirdtask = min(firsttask[which(firsttask>secondtask)])
fourthtask = length(firsttask)
output = list(firsttask, data.frame(average=secondtask,
min_over_mean=thirdtask,
size=fourthtask))
return(output)
}
thingofinterest = c(1:10)
limits = c(5:10)
test = vector("list", length = length(limits))
for(i in 1:length(limits)) {
test[[i]] = action(thingofinterest, limits, i)
}
test
Run Code Online (Sandbox Code Playgroud)
我想用矢量化命令替换 for 循环,而不是任何apply函数系列,因为它们并不总是能提高性能(我并不是说 for 循环有任何问题,我只需要优化此中的速度)案例。参见:R 的 apply 系列比语法糖更重要吗?)。我该怎么做?
是否存在类似于R的Python pandas函数dplyr::mutate(),该函数可以通过在分组数据的列之一上应用函数来向分组数据添加新列?下面是对该问题的详细说明:
我使用以下代码生成了示例数据:
x <- data.frame(country = rep(c("US", "UK"), 5), state = c(letters[1:10]), pop=sample(10000:50000,10))
Run Code Online (Sandbox Code Playgroud)
现在,我想添加一个新列,该列具有美国和英国的最大人口。我可以使用以下R代码来做到这一点...
x <- group_by(x, country)
x <- mutate(x,max_pop = max(pop))
x <- arrange(x, country)
Run Code Online (Sandbox Code Playgroud)
...或等效地,使用R dplyr管道运算符:
x %>% group_by(country) %>% mutate(max_pop = max(pop)) %>% arrange(country)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是我如何在Python中使用熊猫做到这一点?我尝试了以下操作,但没有成功
x['max_pop'] = x.groupby('country').pop.apply(max)
Run Code Online (Sandbox Code Playgroud) 可能重复:将
多个CSV文件读入单独的数据框
我需要从一个文件夹中将许多csv文件读入数据帧.csv文件名的格式为fxpair-yyyy-mm.csv(例如AUDJPY-2009-05.csv).我想读取所有csv文件并创建fxpair.yyyy.mm形式的数据帧
我在循环中创建数据框名称以便从read.csv语句中进行赋值时遇到问题
filenames <- list.files(path=getwd())
numfiles <- length(filenames)
#fx.data.frames to hold names that will be assigned to csv files in csv.read
fx.data.frames <- gsub(pattern="-",x=filenames,replacement=".")
fx.data.frames <- gsub(pattern=".csv",x=fx.data.frames,replacement="")
i <-1
for (i in c(1:numfiles)){
filenames[i] <- paste(".\\",filenames[i],sep="")
fx.data.frames[i] <- read.csv(filenames[i], header=FALSE)
}
Run Code Online (Sandbox Code Playgroud)
csv.read似乎工作正常,但我无法以我想要的方式创建数据框对象.我只是想根据文件名命名以fxpair.yyyy.mm格式读取的数据帧.
我错过了什么obvius?感谢您的任何帮助!!
我知道我应该避免for循环,但我不确定如何使用apply函数做我想做的事情.
这是我正在尝试做的一个略微简化的模型.所以,基本上我有一个很大的预测变量矩阵,我想在索引预测器的每一侧使用一个包含5个预测变量的窗口运行回归(在for循环的情况下是i).有了for循环,我可以说:
results<-NULL
window<-5
for(i in 1:ncol(g))
{
first<-i-window #Set window boundaries
if(first<1){
1->first
}
last<-i+window-1
if(last>ncol(g)){
ncol(g)->last
}
predictors<-g[,first:last]
#Do regression stuff and return some result
results[i]<-regression stuff
}
Run Code Online (Sandbox Code Playgroud)
使用apply函数有一个很好的方法吗?我的问题是,应用的向量将推入函数真的无所谓.重要的是指数.
我试图从矢量创建这样的矩阵:
vec= c(2, 5, 9)
> A
[,1] [,2] [,3] [,4]
[1,] 2 0 0 0
[2,] 5 3 0 0
[3,] 9 7 4 0
Run Code Online (Sandbox Code Playgroud)
实际上,第一列始终是向量元素,第二列以0开始,然后是(5-2 = 3),然后第二列的thirld元素是(9-2 = 7).然后第三列从0开始,然后是0和(9-5 = 4),最后一列始终为零.可能是vec更改为任何数字的长度,例如4,5,.......如何编写有效的函数或代码来创建此矩阵?
我希望能够对以下循环进行矢量化:
for (i in 1:n) {
for (j in 1:m) {
temp_mat[i,j]=min(temp_mat[i,j],1);
}
}
Run Code Online (Sandbox Code Playgroud)
我以为我能做到temp_mat=min(temp_mat,1),但这并没有给我预期的结果.有没有办法对这个循环进行矢量化以使其更快?
我试图在20x20矩阵中找到2位数的最大对角线乘积.
这会给出一条错误消息:
i <- 17:1
z <- for (j in 1:(18-i))
{b <- max ((x[i,j]*x[i+1,j+1]*x[i+2,j+2]*x[i+3,j+3]))}}
Run Code Online (Sandbox Code Playgroud)
但这不是:
z <- for (i <- 17:1)
{for (j in 1:(18-i))
{b <- max ((x[i,j]*x[i+1,j+1]*x[i+2,j+2]*x[i+3,j+3]))}}
Run Code Online (Sandbox Code Playgroud)
但第二个版本给了我一个太小的数字.为什么第一个不起作用,我认为它会产生正确的答案,但我不明白错误信息.
我是R.的新手.现在我的功能如下:
funItemAverRating = function()
{
itemRatingNum = array(0, itemNum);
print("begin");
apply(input, 1, function(x)
{
itemId = x[2]+1;
itemAverRating[itemId] <<- itemAverRating[itemId] + x[3];
itemRatingNum[itemId] <<- itemRatingNum[itemId] + 1;
}
);
}
Run Code Online (Sandbox Code Playgroud)
在这个函数中输入是一个n*3数据框,n是~6*(10e+7),itemRatingNum是一个大小的向量~3*(10e+5).
我的问题是为什么apply功能这么慢(完成需要将近一个小时)?此外,随着函数的运行,它会使用越来越多的内存.但正如您所看到的,变量都是在apply函数外部定义的.有谁能够帮我?
程
for循环在R中非常慢。我想知道while循环是否同样如此。
如果是这样,是否有一种方法可以优化R中的while循环?例如,对于for循环,apply函数发挥出色作用,但我不知道while循环的模拟方式。
甚至哈德利(Hadley)在他的书(《高级R》)中对于如何优化while循环也很模糊。
是否可以监控向量化操作的进度R?例如,在循环中总是if (i %% 10000) print(i)可以查看代码当前正在处理哪个元素。我的直觉是“可能不是”,但可能是我错了?