在R中优化比较
我对R编程还是新手,我需要优化代码的某些部分。我将在下面解释它是如何工作的 我当前的代码太慢了 一些解释 对于在R中优化比较,r,performance,optimization,comparison,R,Performance,Optimization,Comparison,我对R编程还是新手,我需要优化代码的某些部分。我将在下面解释它是如何工作的 我当前的代码太慢了 一些解释 对于CURRENT的所有值(如1,2,3,4,5,…1000)调用此函数,我们希望在dt中为匹配dt$time==CURRENT的每一行更新$value,而且变量“varname”每CURRENT一次都会被修改 dt : a data.table ordered by time in the form of foo bar baz time related_var
CURRENT的所有值(如1,2,3,4,5,…1000)
调用此函数,我们希望在dt
中为匹配dt$time==CURRENT
的每一行更新$value
,而且变量“varname”每CURRENT
一次都会被修改
dt : a data.table ordered by time in the form of
foo bar baz time related_var value
1 1 "toto" 1 "varname" NA
1 2 "toto" 1 "varname" NA
2 1 "tata" 1 "varname" NA
2 8 "toto" 1 "varname" NA
...
related_var : contain the name of a global data.frame which have its
colnames defined by baz in dt
rownames defined by a combination of foo & bar (foo_bar) in dt
example of "varname" variable:
toto tata
1_1 1.6 2
1_2 42 1337
... ... ...
10_10 3.14 1.61
我已经做了一些更改(我在数据.table
或eval(parse(…)
)之前使用了数据.frame
),但这仍然非常慢(对于约5000行的dt,大约5秒),如果您有想法(R或纯算法),我想知道如何优化它
注意,告诉我它是否太神秘了
编辑:我发现缓慢的部分是
dt$value[I]=get(dt$related\u var[I])[[linename,colname]]]
,如果我做一个简单的分配,比如justAvar=get(dt$related\u var[I])[[linename,colname]]
,那么我现在的问题是:“R是如何通过索引的?如果我想进入index=15,R是否会遍历之前的所有14个元素?”首先,我会预计算linename,我怀疑它几乎是为整个数据表计算的。将使用data.table引用魔法。第二,内联并简化函数。最后,使用data.table[I,j,by]方法
dt <- ...
dt[, linename := paste(foo, "_", bar, sep="")]
CURRENT <- 0
MAX <- 1000
for(i in 1:MAX) {
doSomeStuffOnGlobalVars()
# get datas from global var for this CURRENT
dt[time == CURRENT, value := get(related_var)[[linename, baz]]]
CURRENT <- CURRENT + 1
}
乍一看,我认为您可以将这个-
linename=paste(dt$foo[I],“x”,dt$bar[I],sep=”“)
-移动到循环之外,因为paste
和[
是矢量化的。与优化无关,但将CURRENT
作为参数传递给myfunc
,而不是依赖作用域规则在父环境中找到它,这将更为惯用。据我所知,在函数内部根本不需要for
循环(可能是最后一条语句,但即使是这条语句,也可以使用mget
和lapply
组合进行矢量化)。感谢linename的示例,它工作得很好,但当我尝试在dt[time==CURRENT,value:=get(related\u var)中添加更多级别时,在级别2上出现了一个错误递归索引失败[[尝试过其他级别][[linename,baz]]
有没有办法像foo$bar$baz$toto$tata$lorem$['ipsum','dolor']]那样深入know@user3482164坦白地说,我不知道,现在似乎正在进行很好的讨论。您可能想继续,用代码/数据示例等问另一个问题
dt : a data.table ordered by time in the form of
foo bar baz time related_var value
1 1 "toto" 1 "varname" NA
1 2 "toto" 1 "varname" NA
2 1 "tata" 1 "varname" NA
2 8 "toto" 1 "varname" NA
...
related_var : contain the name of a global data.frame which have its
colnames defined by baz in dt
rownames defined by a combination of foo & bar (foo_bar) in dt
example of "varname" variable:
toto tata
1_1 1.6 2
1_2 42 1337
... ... ...
10_10 3.14 1.61
dt <- ...
dt[, linename := paste(foo, "_", bar, sep="")]
CURRENT <- 0
MAX <- 1000
for(i in 1:MAX) {
doSomeStuffOnGlobalVars()
# get datas from global var for this CURRENT
dt[time == CURRENT, value := get(related_var)[[linename, baz]]]
CURRENT <- CURRENT + 1
}
setkey(dt, time)