在R中分割和访问数据帧行的最有效方法是什么?

时间:2014-04-04 19:52:44

标签: r

我需要遍历数据框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必须已经看到每个对出现的位置,即使它没有保存它。有没有办法保存它,所以我有一个布尔矢量,我可以用于每个对,以更有效地从数据帧中选择它们?或者是否有另一种更好的方法来做到这一点?

我有一种感觉,plyrreshape的一些使用可以帮助我,但我仍然相对较新的大R生态系统,所以一些指导将非常感激。

1 个答案:

答案 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)]