Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 为什么这么慢_R - Fatal编程技术网

R 为什么这么慢

R 为什么这么慢,r,R,我有大约45万行的以下数据: 'data.frame': 451712 obs. of 7 variables: $ mid: int 5732 5732 5732 5732 5732 5732 5732 5732 5732 5732 ... $ id : int 25 26 28 29 30 31 33 36 37 38 ... $ x : num 3197 5545 3205 6947 7264 ... $ y : num 6138 5555 6209 5465 5

我有大约45万行的以下数据:

'data.frame':   451712 obs. of  7 variables:
 $ mid: int  5732 5732 5732 5732 5732 5732 5732 5732 5732 5732 ...
 $ id : int  25 26 28 29 30 31 33 36 37 38 ...
 $ x  : num  3197 5545 3205 6947 7264 ...
 $ y  : num  6138 5555 6209 5465 5230 ...
 $ t  : Factor w/ 2 levels "C","L": 2 2 2 2 2 2 2 2 2 2 ...
 $ r  : Factor w/ 5 levels "Aberrant","Both",..: 3 1 3 4 4 4 4 4 4 4 ...
 $ c  : num  1 0 1 2 2 2 2 3 2 2 ...
为什么以下操作需要很长时间(>5分钟,我停止执行)


split
本身速度很快,但在合并数据时,它需要花费很长时间。如果我将数据截断到100000行,那么我可以在10秒钟内得到结果,但随着行数的增加,时间并不是线性增加。

虽然这看起来很奇怪,但您需要了解的是,数据帧的速度非常慢。修改数据帧的每个操作都是昂贵的,而
unsplit
所做的是通过重新插入数据帧来修改每次拆分的数据帧。内部逻辑要求每次修改时复制整个数据帧。这被称为
unsplit
的一部分:

`split<-.data.frame`
function (x, f, drop = FALSE, ..., value) 
{
    ix <- split(seq_len(nrow(x)), f, drop = drop, ...)
    n <- length(value)
    j <- 0
    for (i in ix) {
        j <- j%%n + 1
        x[i, ] <- value[[j]]
    }
    x
}
<bytecode: 0x7ffd5e282c68>
<environment: namespace:base>
顺便说一下,这就是为什么对于上述类型的操作,建议首先计算向量,最后将向量替换到数据帧列中,以便只修改数据帧一次


回复:使用
data.table
dplyr
,我要求您将使用
split
/
unsplit
进行的分析类型作为一个问题发布出来,我怀疑您会惊讶于这些包在解决您的问题方面有多么强大。

您检查了RAM分配了吗?如果你把所有的东西都吃光了,就会发生大量的交换,导致更长的执行时间。看看如果在
k*1e5
块上运行循环会发生什么。您真的需要按与以前相同的顺序保存数据吗?如果不考虑使用<代码> do.Cube(rBin,Stata(data,data $MID)),这在我的测试中看起来有点快。此外,你可以添加一些代码来生成像你这样的数据吗?比如:<代码>大概你正在做一些<代码>拆分应用合并样式分析吗?如果是这样,您是否考虑过使用
data.table
dplyr
,因为两者都可能快得多?@CarlWitthoft,RAM使用率没有增长。只有CPU被大量使用。哇@布罗迪格,谢谢你这么全面的回答!现在很清楚为什么时间会随着群体数量的增加而快速增长。一定会花一些时间学习推荐的软件包。
`split<-.data.frame`
function (x, f, drop = FALSE, ..., value) 
{
    ix <- split(seq_len(nrow(x)), f, drop = drop, ...)
    n <- length(value)
    j <- 0
    for (i in ix) {
        j <- j%%n + 1
        x[i, ] <- value[[j]]
    }
    x
}
<bytecode: 0x7ffd5e282c68>
<environment: namespace:base>
df <- data.frame(a=seq(1:100), b=runif(100), c=sample(1:10, 100, rep=T))
mx <- as.matrix(df)

microbenchmark(for(i in 1:nrow(df)) df[i, 2] <- 1)
# Unit: milliseconds
#                                 expr      min       lq   median       uq      max neval
#  for (i in 1:nrow(df)) df[i, 2] <- 1 4.018833 4.273562 4.584293 4.726672 23.46349   100    

microbenchmark(for(i in 1:nrow(mx)) mx[i, 2] <- 1)
# Unit: microseconds
#                                 expr     min       lq   median       uq     max neval
#  for (i in 1:nrow(mx)) mx[i, 2] <- 1 148.304 153.9795 158.5975 163.7065 277.861   100