如何组合数据集而不循环具有多个值的数据集?

时间:2013-09-03 01:42:08

标签: r loops matrix dataset

鉴于我现在所知道的基本工具(其中,如果,%,%,订单等等),我经常遇到一个我称之为“唯一性问题”的问题。

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

我有一个矩阵A我希望从另一个原始矩阵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

我想为矩阵A中的每个UPC填充day1,其中包含矩阵B中的数量。问题是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

您是否知道任何可以在不循环的情况下实现此目的的功能?

2 个答案:

答案 0 :(得分:5)

如果您将原始矩阵转换为data.frame,则可以使用aggregatemergereshape来实现目标:

999添加的ID

制作一些数据,包括多天
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和日汇总数量,然后合并和重塑:

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

答案 1 :(得分: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以块的形式进行。