3

鉴于我现在知道的基本工具(其中,order、if、%in%、order 等),我经常遇到一个我称之为“唯一性问题”的问题。

问题基本上是这样的......

我有一个矩阵 AI 想要从另一个原始矩阵 B 中填充。

 A:  
     [upc]  [day1]    [day2]     ...    day52 
[1]  123     NA       NA                 NA
[2]  456     NA       NA                 NA
[3]  789     NA       NA                 NA

B 是巨型行明智的,所以循环是不可能的。

     [upc]    [quantity]          [day] 
[1]  123         11                 1
[2]  123          2                 1
[3]  789          5                 1
[4]  456         10                 1
[5]  789          6                 1

我想用矩阵 B 中的数量填充矩阵 A 中每个 UPC 的第 1 天。问题是 B 中的每个 UPC 有多个实例,我无法遍历它们以获得放在旁边的总量每个upc。

所以我想要的是这个..(这将完全填写,即第 2-52 天 ..通过循环其他天,这很小,因此易于管理)

A:  
     [upc]  [day1]    [day2]     ...    day52 
[1]  123     13        NA                 NA
[2]  456     10        NA                 NA
[3]  789     11        NA                 NA

您知道任何无需循环即可完成此任务的功能吗?

4

2 回答 2

5

如果您将原始矩阵转换为data.frames,您可以使用aggregate,mergereshape到达那里:

为添加的 id 制作一些数据,包括多天999

A <- data.frame(upc=c(123,456,789,999))
B <- data.frame(
  upc=c(123,123,789,456,789,999,999,999),
  quantity=c(11,2,5,10,6,10,3,3),
  day=c(1,1,1,1,1,1,2,2)
)

按 id 和 day 聚合数量,然后合并和重塑:

mrgd <- merge(A,aggregate(quantity ~ upc + day ,data=B, sum),by="upc")
final <- reshape(mrgd,idvar="upc",timevar="day",direction="wide",sep="")
names(final) <- gsub("quantity","day",names(final))

这使:

final
#  upc day1 day2
#1 123   13   NA
#2 456   10   NA
#3 789   11   NA
#4 999   10    6
于 2013-09-03T02:00:53.750 回答
2

A您可以使用以下tapply函数创建矩阵:

> B <- data.frame(
+   upc=c(123,123,789,456,789,999,999,999),
+   quantity=c(11,2,5,10,6,10,3,3),
+   day=c(1,1,1,1,1,1,2,2)
+ )
> tapply( B$quantity, B[,c('upc','day')], FUN=sum )
     day
upc    1  2
  123 13 NA
  456 10 NA
  789 11 NA
  999 10  6
> 

如果 B 矩阵真的很大,那么你可以考虑将它保存为一个ff对象(ff 包),然后用ffrowapply它来分块。

于 2013-09-03T03:23:13.157 回答