R:在非常大的数据帧上加速for循环?

R:在非常大的数据帧上加速for循环?,r,for-loop,R,For Loop,我有一组巨大的坐标和相关的Z值。某些坐标对使用不同的Z值重复多次。我想获得每个唯一坐标对的所有Z值的平均值 我写了一小行代码,在一个小数据帧上运行得非常好。问题是,我的实际数据帧有超过200万行,计算需要超过10小时才能完成。我想知道是否有一种方法可以提高效率并减少计算时间 以下是我的df的外观: > df x y Z xy 1 -54.60417 4.845833 0.3

我有一组巨大的坐标和相关的Z值。某些坐标对使用不同的Z值重复多次。我想获得每个唯一坐标对的所有Z值的平均值

我写了一小行代码,在一个小数据帧上运行得非常好。问题是,我的实际数据帧有超过200万行,计算需要超过10小时才能完成。我想知道是否有一种方法可以提高效率并减少计算时间

以下是我的df的外观:

> df
           x        y         Z                                 xy
1  -54.60417 4.845833 0.3272980 -54.6041666666667/4.84583333333333
2  -54.59583 4.845833 0.4401644 -54.5958333333333/4.84583333333333
3  -54.58750 4.845833 0.5788663          -54.5875/4.84583333333333
4  -54.57917 4.845833 0.6611844 -54.5791666666667/4.84583333333333
5  -54.57083 4.845833 0.7830828 -54.5708333333333/4.84583333333333
6  -54.56250 4.845833 0.8340629          -54.5625/4.84583333333333
7  -54.55417 4.845833 0.8373666 -54.5541666666667/4.84583333333333
8  -54.54583 4.845833 0.8290986 -54.5458333333333/4.84583333333333
9  -54.57917 4.845833 0.9535526 -54.5791666666667/4.84583333333333
10 -54.59583 4.837500 0.0000000           -54.5958333333333/4.8375
11 -54.58750 4.845833 0.8582580          -54.5875/4.84583333333333
12 -54.58750 4.845833 0.3857006          -54.5875/4.84583333333333
您可以看到一些xy坐标是相同的(例如第3、11、12行或第4和9行),我想要所有这些相同坐标的平均Z值。这是我的剧本:

mean<-vector(mode = "numeric",length = length(df$x))

for (i in 1:length(df$x)){
  mean(df$Z[which(df$xy==df$xy[i])])->mean[i]
} 
mean->df$mean
df<-df[,-(3:4)]
df<-unique(df)

这就行了,但是对于行数更多的df,肯定有办法加快这个过程(可能没有for循环)?

您可以尝试
dplyr::summary

library(dplyr)
df %>%
  group_by(x, y) %>%
  summarise(meanZ = mean(Z))
我猜这将需要不到一分钟的时间,取决于你的机器


其他人可能会提供一个
数据表
答案,这可能会更快。

欢迎!在将来,最好能为我们提供一种快速的方法来复制和粘贴一些代码,以生成您正在使用的数据集的基本特性。以下是我认为的一个例子:

DF <- data.frame(x = sample(c(-54.1, -54.2), size = 10, replace = TRUE),
                 y = sample(c(4.8, 4.4), size = 10, replace = TRUE),
                 z = runif(10))
DF 2:-54.2 4.8 0.4604533
#> 3: -54.1 4.4 0.3037848
#> 4: -54.1 4.8 0.5734239
图书馆(dplyr)
#> 
#>正在附加包:“dplyr”
#>以下对象已从“package:data.table”屏蔽:
#> 
#>在…之间,在…之间
#>以下对象已从“package:stats”屏蔽:
#> 
#>滤波器,滞后
#>以下对象已从“package:base”屏蔽:
#> 
#>相交、setdiff、setequal、并集
df%>%
(x,y)%>%
总结(平均值=平均值)
#>#tibble:4 x 3
#>#组:x[?]
#>x y平均值
#>      
#> 1 -54.2   4.4  0.349
#> 2 -54.2   4.8  0.460
#> 3 -54.1   4.4  0.304
#> 4 -54.1   4.8  0.573

由(v0.2.1)创建于2018-09-21,计算时间不到10秒!我对data.table和dplyr一点也不熟悉,将来我一定会纠正的。谢谢你的快速回答!
DF <- data.frame(x = sample(c(-54.1, -54.2), size = 10, replace = TRUE),
                 y = sample(c(4.8, 4.4), size = 10, replace = TRUE),
                 z = runif(10))