使用ddply()获取某些ID的频率,通过多行中的外观(在R中)

时间:2013-10-29 23:23:25

标签: r plyr

目标

如果以下描述很难遵循,请参阅示例“之前”和“之后”以查看简单示例。

我有交换数据,有独特的交易ID,以及交易的两个方面。 Side1和Side2是篮子,项目ID列表代表易货交易的两面。

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

此外,我想用plyr ddply函数执行此操作。

(如果你对我的动机感兴趣,我会处理成千上万的交易,并且已经使用ddply来计算其他几个摘要统计数据。我想把它添加到ddply我已经使用,而不是在之后计算,并将其合并到ddply输出中......抱歉,如果难以理解的话。)

就伪代码而言我正在努力:

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

    我的数据结构示例和我想要的输出。

    数据示例(之前):

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

    感谢您提供的任何帮助!

    柯蒂斯

1 个答案:

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

df output

请注意,ItemsID略有不合理。