我是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),因为我想做什么,但我不知道如何让它更柔和。我在向数据帧添加行时遇到了很多麻烦。
对此有什么想法吗?
答案 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
会加快速度。