R ave还是申请?通过具有strata变量但快速和多列的函数添加列

时间:2014-03-30 00:15:39

标签: r matrix apply

在R:

我不确定这个问题的正确标题是什么,所以也许有人可以帮助我。这将不胜感激。如果这被称为易于搜索的东西,我很抱歉。

所以我有一个参差不齐的数组矩阵(多个UPCS)

       [upc]    [quantity1]   [quantity2]    [sum1]       [sum2]
[1]  123         11               3              NA         NA   
[2]  123          2               1              NA        ...
[3]  789          5               3              NA 
[4]  456         10               6              NA 
[5]  789          6               2              NA         NA

我希望矩阵由UPC求和,例如:

       [upc]    [quantity1]   [quantity2]    [sum1]       [sum2]
[1]  123         11               3              13         4   
[2]  123          2               1              13         4
[3]  789          5               3              11         5
[4]  456         10               6              10         6
[5]  789          6               2              11         5

感谢您的时间和帮助。

诀窍是需要以最有效的方式完成,因为它会多次完成。

1 个答案:

答案 0 :(得分:2)

如果这些是data.frame,通常的方法是使用aggregate函数将相同的函数应用于相同的分组变量,但它的行为不像ave和返回更短的结果。我怀疑它没有使用data.table,dplyr函数或Rcpp方法那么快。

aggregate( df[ , 2:3], df[1], sum)

这将是data.table:

的方式
library(data.table)
dt <- data.table(df)
setkey(dt, "upc")
# To show you what the inner expression would return
 dt[, lapply(.SD, sum), by="upc"]
#-----------    
upc quantity1 quantity2
1: 123        13         4
2: 456        10         6
3: 789        11         5
#-----------    
 dt[ dt[, lapply(.SD, sum), by="upc"] ]   # It is a self join operation
   upc quantity1 quantity2 quantity1.1 quantity2.1
1: 123        11         3          13           4
2: 123         2         1          13           4
3: 456        10         6          10           6
4: 789         5         3          11           5
5: 789         6         2          11           5

然后返回效率较低的data.frame方法....将第一个参数放在源列中,你将merge by upc:

> merge(df, aggregate( df[ , 2:3], df[1], sum), by="upc")
  upc quantity1.x quantity2.x quantity1.y quantity2.y
1 123          11           3          13           4
2 123           2           1          13           4
3 456          10           6          10           6
4 789           5           3          11           5
5 789           6           2          11           5