【问题标题】:Extract top N values base on multiple variables根据多个变量提取前 N 个值
【发布时间】:2015-06-08 20:41:36
【问题描述】:

我知道如何使用 plyr (ddply) 提取前 N 个值,如下所示,但这是基于基于一个变量的排序和提取...我想基于两个变量进行提取。我该怎么做?

例如

rats<- read.table("http://vincentarelbundock.github.io/Rdatasets/csv/KMsurv/rats.csv", header=TRUE, sep=",", na.strings="NA", dec=".", strip.white=TRUE)
top = ddply(rats, .(litter), function(x) data.frame(reads=tail(sort(x$time),1)))

上面的脚本可以很好地提取每窝的最高值,但是如果我想要通过处理(rx 列)获得每窝的最高值怎么办?

非常感谢任何帮助。

【问题讨论】:

  • 只需使用.(litter, rx) 而不是.(litter)
  • 看起来所有的窝都有一个 1 和两个 0 rx,所以你可以像这样排序和索引:o &lt;- rats[with(rats, order(litter, rx, time)), ]; o[rep(c(FALSE, TRUE, TRUE), 50), ]
  • @rawr 这是给定现有代码的最直接答案 - 作为答案发布以便我可以投票?
  • 我在发布之前尝试了上面的 rwar 答案,但没有成功。这就是我寻找不同方法的原因。
  • 我试过了,效果很好,怎么不适合你

标签: r plyr


【解决方案1】:

这会产生每个 litter 和 rx 组合的最高时间值:

library(dplyr)
rats %>%
  group_by(litter, rx) %>% # group
  arrange(-time) %>% # sort
  slice(1) # take top 1 row per subgroup


Source: local data frame [100 x 5]
Groups: litter, rx

    X litter rx time status
1   3      1  0  104      0
2   1      1  1  101      0
3   6      2  0  104      0
4   4      2  1  104      0
5   8      3  0  104      0
6   7      3  1  104      0
7  11      4  0   97      0
8  10      4  1   77      0
9  14      5  0  104      0
10 13      5  1   89      0
.. ..    ... ..  ...    ...

您的问题标题为“前 N 个” - 如果您想要超过前 1 个,请在 slice() 调用中调整该参数。

处理关系:如果子组中存在关系(如在此数据集中),并且您想要 N > 1 的 Top-N,这将返回具有相同时间值的记录。对于前 N 个 唯一 值,您可以在 group_by 后面添加一行 distinct(time) %&gt;% 以过滤唯一值。

【讨论】:

  • 这将是愚蠢的,但我如何看到其余的结果?我用我的数据集尝试过,但它在 10 个条目处停止,就像上面一样
  • dplyr 将返回一个 tbl_df 并且故意只显示前 10 行;查看所有行的一些选项在这里:stackoverflow.com/questions/23188900/…。如果您根本不想弄乱tbl_df,您可以将dplyr 代码块包装在data.frame() 调用中。
  • 好的,我做了 data.frame 换行,但现在查看数据我可以看到一些垃圾有双重条目。例如,如果您查看以上数据集的结果,第 11-12 行是相同的(第 18-19 行也是如此) - 这是因为条目具有相同的时间值......你如何删除相同的结果?
  • 我刚刚将答案从使用top_n()(这将返回您注意到的关系)更改为使用arrange() 以时间降序排序然后@987654333 的排序和切片方法@ 为每个子组选择顶行。您可以保留top_n() 并在该行之后切片以打破平局;我稍微喜欢这个,因为如果你想要前 2 名,你只需要在一个地方而不是两个地方进行调整。
猜你喜欢
  • 2021-12-30
  • 1970-01-01
  • 2016-11-01
  • 1970-01-01
  • 2016-03-12
  • 2017-06-13
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多