在具有每个对象的多个观察值的数据集中。对于每个主题,我希望选择具有最大值'pt‘的行。例如,使用以下数据集:
ID <- c(1,1,1,2,2,2,2,3,3)
Value <- c(2,3,5,2,5,8,17,3,5)
Event <- c(1,1,2,1,2,1,2,2,2)
group <- data.frame(Subject=ID, pt=Value, Event=Event)
# Subject pt Event
# 1 1 2 1
# 2 1 3 1
# 3 1 5 2 # max 'pt' for Subject 1
# 4 2 2 1
# 5 2 5 2
# 6 2 8 1
# 7 2 17 2 # max 'pt' for Subject 2
# 8 3 3 2
# 9 3 5 2 # max 'pt' for Subject 3
对象1、2和3分别具有最大的pt值5、17和5。
我如何首先找到每个对象的最大pt值,然后将此观察结果放入另一个数据框中?得到的数据帧应该只具有每个主题的最大pt值。
发布于 2014-07-04 00:11:52
这是一个data.table
解决方案:
require(data.table) ## 1.9.2
group <- as.data.table(group)
如果您想在每个组中保留pt
最大值对应的所有条目:
group[group[, .I[pt == max(pt)], by=Subject]$V1]
# Subject pt Event
# 1: 1 5 2
# 2: 2 17 2
# 3: 3 5 2
如果只想要pt
的第一个最大值
group[group[, .I[which.max(pt)], by=Subject]$V1]
# Subject pt Event
# 1: 1 5 2
# 2: 2 17 2
# 3: 3 5 2
在这种情况下,这没有什么区别,因为数据中的任何组中都没有多个最大值。
发布于 2016-02-18 07:06:34
最直观的方法是在dplyr
中使用group_by
和top_n
函数
group %>% group_by(Subject) %>% top_n(1, pt)
你得到的结果是
Source: local data frame [3 x 3]
Groups: Subject [3]
Subject pt Event
(dbl) (dbl) (dbl)
1 1 5 2
2 2 17 2
3 3 5 2
发布于 2015-04-08 01:12:47
使用data.table
的更短的解决方案
setDT(group)[, .SD[which.max(pt)], by=Subject]
# Subject pt Event
# 1: 1 5 2
# 2: 2 17 2
# 3: 3 5 2
https://stackoverflow.com/questions/24558328
复制相似问题