我有一个大型数据框,其中多行是针对单个ID的重复测量。我想为每个人返回具有最大列值的行。基本上按照SQL执行group.by()函数。
数据框(用于说明目的)
ID lac pO2 M1 1 80 M1 4 80 M2 2 70 M2 3 70 M3 3 75 M3 5 75
我想调用max(lac)并返回以下结果。
ID lac pO2 M1 4 80 M2 3 70 M3 5 75
我已经四处看看并认为by()函数可能有用,但是没有任何乐趣(代码如下)。
newdf <- by(df, df$ID, max(df$lac))
Error in FUN(X[[1L]], ...) : could not find function "FUN"
我也看了tapply,但这不起作用,因为我使用的是数据帧而不是矢量。
newdf <- tapply(df, df$ID, max)
Error: "arguments must have same length"
我看过similar answers,但这些没有帮助。我很感激那些比我更有经验的人的一些意见!
修改
挖得更深一点我发现this question表明plyr包可能有用。
答案 0 :(得分:2)
试试这个:
> by(mtcars, mtcars$cyl, max)
mtcars$cyl: 4
[1] 146.7
---------------------------------------------------------------------------------------
mtcars$cyl: 6
[1] 258
---------------------------------------------------------------------------------------
mtcars$cyl: 8
[1] 472
或者使用plyr
:
> require(plyr)
Loading required package: plyr
> ddply(mtcars, .(cyl), max)
cyl V1
1 4 146.7
2 6 258.0
3 8 472.0
答案 1 :(得分:2)
对于大数据集,请尝试data.table
(假设df
是您的数据集)
library(data.table)
setDT(df)[, .SD[which.max(lac)], by = ID]
## ID lac pO2
## 1: M1 4 80
## 2: M2 3 70
## 3: M3 5 75
答案 2 :(得分:1)
使用plyr找到解决方案,如更新中所述。
使用的代码是:
max_lac <- ddply(.data=df, .variables=.(ID), function(x)
+ x[which(x$lac == max(x$lac)), ])
答案 3 :(得分:1)
如果你正在处理大型数据集,这里有一个dplyr
替代方案:
library(dplyr)
df %>% group_by(ID) %>% filter(lac == max(lac))
#Source: local data frame [3 x 3]
#Groups: ID
#
# ID lac pO2
#1 M1 4 80
#2 M2 3 70
#3 M3 5 75
请注意,如果同一组ID中有多个行具有最大值,则此函数将返回包含lac中最大值的所有行,而使用which.max(.)
的函数将仅返回第一行包含最大值(每组)。
如果您只想返回每组的第一个最大值,您可以使用例如:
df %>% group_by(ID) %>% filter(1:n() == which.max(lac))
或
df %>% group_by(ID) %>% filter(lac == max(lac)) %>% do(head(.,1))
答案 4 :(得分:0)
(如果你看看ddply和which.max) 可以吗?:
ddply(df,.ID,function(x){x[which.max(x$lac)),]}