在R数据帧中对分组行执行功能

时间:2014-08-11 14:11:27

标签: r dataframe subset

我有一个大型数据框,其中多行是针对单个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包可能有用。

5 个答案:

答案 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)),]}