我需要遍历数据框df
,其中
colnames(df) == c('year','month','a','id','dollars')
我需要遍历所有通过
找到的唯一对('a','id')
counts <- count(df, c('area','normalid'))
uniquePairs <- counts[ counts$freq > 10, c('a','id') ]
接下来,我遍历每个唯一的对,找到相应的行(我已经恰当地命名了uniquePairs
的每一列):
aVec <- as.vector( uniquePairs$a )
idVec <- as.vector( uniquePairs$id )
for (i in 1:length(uniquePairs))
{
a <- aVec[i]
id <- idVec[i]
selectRows <- (df$a==a & df$id==id)
# ... get those rows and do stuff with them ...
df <- df[!selectRows,] # so lookups are slightly faster next time through
# ...
}
我知道一般来说不鼓励循环,但在这种情况下我认为这是合适的。至少在我看来这与这个问题无关,但也许更有效的方法就是摆脱循环。
数据框中有10-100k行,有意义的是它在查找时间和nrow(df)
之间的关系比线性更差(尽管我没有测试过)。
现在unique
必须已经看到每个对出现的位置,即使它没有保存它。有没有办法保存它,所以我有一个布尔矢量,我可以用于每个对,以更有效地从数据帧中选择它们?或者是否有另一种更好的方法来做到这一点?
我有一种感觉,plyr
或reshape
的一些使用可以帮助我,但我仍然相对较新的大R生态系统,所以一些指导将非常感激。
答案 0 :(得分:1)
data.table
是您最好的选择:
dt = data.table(df)
dt[,{do stuff in here, then leave results in list form},by=list(a, id)]
对于某个变量的平均值的简单情况:
dt[,list(Mean = mean(dollars)), by = list(a, id)]