1

目标

如果以下描述难以理解,请查看示例“之前”和“之后”以查看简单示例。

我有易货数据,具有唯一的贸易 ID,以及贸易的两个方面。Side1 和 Side2 是篮子,代表易货交易双方的项目 ID 列表。

我想计算每个项目出现在 TRADES 中的频率。例如,如果项目“001”出现在 3 次交易中,我将计数为 3(忽略该项目在每次交易中出现的次数)。

此外,我想用 plyr ddply 函数来做到这一点。

(如果您对我的动机感兴趣,我处理了数十万笔交易,并且已经在使用 ddply 来计算其他几个汇总统计信息。我想将此添加到我已经使用的 ddply 中,而不是比之后计算它,并将其合并到 ddply 输出中......对不起,如果这很难理解。)

在伪代码方面,我正在处理:

  1. 合并 Side1 和 Side2 的每一行
  2. 按行,获取每个项目 id 的 unique() 外观
  3. 应用表()函数
  4. 转置和重新标记表中的输出

我的数据结构示例,以及我想要的输出。

数据示例(之前):

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[])

谢谢你尽你所能的帮助!

柯蒂斯

4

1 回答 1

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)))

df 输出

请注意,ItemsID 有点乱。

于 2013-10-30T03:31:46.370 回答