鉴于我现在所知道的基本工具(其中,如果,%,%,订单等等),我经常遇到一个我称之为“唯一性问题”的问题。
问题基本上就是这样......
我有一个矩阵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
您是否知道任何可以在不循环的情况下实现此目的的功能?
答案 0 :(得分:5)
如果您将原始矩阵转换为data.frame
,则可以使用aggregate
,merge
和reshape
来实现目标:
为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
以块的形式进行。