R语言:应该使用R ave函数还是apply函数?如何快速地添加多个列,这些列都包含分层变量的函数值。

3

在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

感谢您的时间和帮助。
关键在于需要以最高效的方式完成,因为这将被多次执行。

“day”列在哪里?你按什么分组? - Robert Krzyzanowski
抱歉,忘记了日期,只是通过 UPC。 - wolfsatthedoor
1个回答

3
如果这些内容在一个data.frame中,通常以相同分组变量应用相同函数的方法是使用aggregate函数,但它不像ave那样运作,并且返回结果较短。我怀疑它的速度不如使用data.table,dplyr函数或Rcpp方法快。
aggregate( df[ , 2:3], df[1], sum)

这是使用data.table的方法:

这是使用 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方法......为了使得第一个参数与源列相邻,您需要通过upc进行合并:merge

> 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

2
这也适用于 data.table:dt[, paste0(names(dt)[-1], "_sum") := lapply(.SD, sum), by = upc] - G. Grothendieck
拥有目标名称向量的能力是一个明显的改进。我没有意识到 := 被设计成可以接受它。这进一步证明了我是一个 data.table 的初学者。 - IRTFM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接