我知道如何使用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列)得到每个垃圾的最高值呢?
非常感谢任何帮助。
答案 0 :(得分:2)
这会产生每个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
.. .. ... .. ... ...
您的问题标题为&#34; Top N&#34; - 如果您想要超过前1名,请在slice()
来电中调整该参数。
处理关系:如果子组内存在联系(如此数据集中)并且您想要Top-N,其中N&gt; 1,这将返回具有相同时间值的记录。对于前N 唯一值,您可以在distinct(time) %>%
后面添加group_by
来过滤唯一值。