在双循环中

时间:2018-04-12 09:16:05

标签: r loops dataframe

我是r的新人。有一个名为MegaFrame的大框架(11 000 000行)。我想为我的不同会话和P_CODE创建另一个数据集,其中包含数据MegaFrame $值的均值。这给出了很多NA,因为很多P_CODE会话对不存在于帧中。我找到了一个(我认为有效的)解决方案,但现在已经运行了12个小时但还没有完成。

colClasses = c("integer", "factor", "integer")
col.names = c("MeanMesure", "P_CODE", "session")

MeanFrame <- data.frame( mean(MegaFrame$value[MegaFrame$session == unique(MegaFrame$session)[i] && MegaFrame$P_CODE == levels(MegaFrame$P_CODE)[i]]),
                       MegaFrame$P_CODE[i],MegaFrame$session[j])
                         colnames(MeanFrame) = col.names
                      MeanFrame<-   MeanFrame[-1,]

for(i in 1:length(unique(MegaFrame$session))){
for(j in 1:length(levels(MegaFrame$P_CODE))){
x<-mean(MegaFrame$value[MegaFrame$session == unique(MegaFrame$session)[i] && MegaFrame$P_CODE == levels(MegaFrame$P_CODE)[i]])  
df<- data.frame(x,MegaFrame$P_CODE[i],MegaFrame$session[j])
colnames(df) = col.names
MeanFrame<-rbind(MeanFrame, df)
}}

我知道我可以添加条件,以便NA值不会添加到数据框中。但是我觉得我的方法太重了(每次迭代都是df,改变他的名字,然后是rbind),因为我想做什么,但我不知道如何让它更柔和。我在向数据帧添加行时遇到了很多麻烦。

对此有什么想法吗?

1 个答案:

答案 0 :(得分:1)

根据您的问题描述,我认为不需要for循环。你可以尝试:

library(tidyverse);
MeanFrame <- MegaFrame %>%
    group_by(P_code, session) %>%
    summarise(mean.value = mean(value))

您可能必须使用mean(value, na.rm = T)代替mean(value)来处理NA

您的代码速度太慢的原因是因为您通过逐行添加动态增长MeanFrame。这就像你可以去的效率低,而且通常可以而且应该避免。如果必须使用for循环,则预先分配正确尺寸的空data.frame会加快速度。

旁注:建议始终提供minimal reproducible example with sample data