【问题标题】:Matching function within standard plyr notation标准 plyr 符号中的匹配函数
【发布时间】:2014-03-02 14:14:30
【问题描述】:

这应该很简单,但是尝试将任何类型的 match[] 语法插入 ddply 参数都会返回错误。如果可能的话,我正在寻找一种在标准 plyr 函数中执行此操作的方法。

我要做的就是总结一个数据框,然后对于我们找到给定值的其中一项,将其与数据框中另一项的对应值相匹配。

它是在这里完成的:Summarise in ddply,但语法变得混乱。

这是一个例子:

data <-  data.frame(
    spend = sample(50:100,50,replace=T),
    trials = sample(100:200,50,replace=T),
    country = sample(c("usa","canada","uk"),50,replace = T)
    )

我想按国家/地区汇总并获取“支出”的最大值。无论该值是什么,我都想为“Trials”提取相应的值。

data2 <- ddply(data, .(country), summarise,
    spend = max(spend),
....

我可以在“总结”中执行此操作还是必须使用自定义函数(df)参数?

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    在包裹中添加一个字母,

    library(dplyr)
    chain(data, 
          group_by(country),
          filter(spend == max(spend)))
    

    【讨论】:

    • 这太棒了。我是 dplyr 的新手……过滤器参数如何同时提取支出及其相应的试验次数?
    • 我只能猜测——我第一次使用 dplyr
    • @MarcTulla 是filter(group_by(data, country), spend == max(spend)) 的快捷方式。 filter() 保留所有现有列。
    • @hadley 感谢您的跟进!我想我仍然很困惑:使用 filter() 来保留现有的列——默认情况下,该函数是否会拉入与 max(spend) 匹配的值?
    • @MarcTulla speed == max(spend) 计算每个组的逻辑向量。 filter() 保持所有行对应 TRUEs
    【解决方案2】:

    你可以使用which.max:

    ddply(data, 
          .(country), 
          summarise, 
          trials=trials[which.max(spend)],
          spend=max(spend))
    

    如果您正在做一些复杂的事情,或者更明确地说:

    ddply(data, 
          .(country),
          summarise,
          trials=head(trials[spend == max(spend)], 1),
          spend=max(spend))
    

    head(...) 调用是在有两行带有max(spend) 的情况下。此外,summarise 后面的参数顺序也很重要...


    嗯,结果不是我所期望的!无论如何,我会使用dplyr(巴蒂斯特的回答)或data.table

    d <- data.table(data)
    
    d[, .SD[spend==max(spend)], by=country]   
    

    【讨论】:

    • 嗯,贾斯汀,我运行了这个,但它不匹配。我只是看到 Trials = 第一个“试用”数字,而不是与一个国家/地区内支出最大值匹配的数字
    • 有一个非常讨厌的错误!结果似乎取决于summarise 之后的表达式顺序。试着把两条线颠倒一下,就可以了!
    • @baptiste wow... 再次正确。并相应地编辑了我的答案。
    • 这不是错误,它在多个地方重用了相同的变量名。
    猜你喜欢
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 2010-12-26
    相关资源
    最近更新 更多