目标
如果以下描述很难遵循,请参阅示例“之前”和“之后”以查看简单示例。
我有交换数据,有独特的交易ID,以及交易的两个方面。 Side1和Side2是篮子,项目ID列表代表易货交易的两面。
我想计算每个ITEM在TRADES中出现的频率。例如,如果项目“001”出现在3个交易中,我将计数为3(忽略每次交易中出现的项目多少次)。
此外,我想用plyr ddply函数执行此操作。
(如果你对我的动机感兴趣,我会处理成千上万的交易,并且已经使用ddply来计算其他几个摘要统计数据。我想把它添加到ddply我已经使用,而不是在之后计算,并将其合并到ddply输出中......抱歉,如果难以理解的话。)
就伪代码而言我正在努力:
我的数据结构示例和我想要的输出。
数据示例(之前):
df <- data.frame(TradeID = c("01","02","03","04"))
df$Side1 = list(c("001","001","002"),
c("002","002","003"),
c("001","004"),
c("001","002","003","004"))
df$Side2 = list(c("001"),c("007"),c("009"),c())
所需的输出(之后):
df.ItemRelFreq_byTradeID <- data.frame(ItemID = c("001","002","003","004","007","009"),
RelFreq_byTrade = c(3,3,2,2,1,1))
在没有ddply的情况下执行此操作的一种方法
我已经找到了一种方法来执行此操作。我的问题是,我似乎无法让ddply为我这样做。
temp <- table(unlist(sapply(mapply(c,df$Side1,df$Side2), unique)))
df.ItemRelFreq_byTradeID <- data.frame(ItemID = names(temp),
RelFreq_byTrade = temp[])
感谢您提供的任何帮助!
柯蒂斯
答案 0 :(得分:1)
我相信这会做你所要求的。它使用ddply
。两次!
res <- ddply(df, .(TradeID), function(df) data.frame(ItemID = c(df$Side1[[1]],df$Side2[[1]]), TradeID = df$TradeID))
ddply(res, .(ItemID), summarise, RelFreq_byTrade = length(unique(TradeID)))
请注意,ItemsID略有不合理。