对R数据帧中的分组行执行函数
我有一个大的数据框,其中多行是对单个ID的重复测量。我想返回每一行的最大列值。基本上按照SQL执行group.by()函数 数据帧(用于说明) 我想调用max(lac)并返回以下结果 我环顾四周,认为by()函数可能有用,但没有任何乐趣(下面的代码)对R数据帧中的分组行执行函数,r,dataframe,subset,R,Dataframe,Subset,我有一个大的数据框,其中多行是对单个ID的重复测量。我想返回每一行的最大列值。基本上按照SQL执行group.by()函数 数据帧(用于说明) 我想调用max(lac)并返回以下结果 我环顾四周,认为by()函数可能有用,但没有任何乐趣(下面的代码) newdf试试这个: > by(mtcars, mtcars$cyl, max) mtcars$cyl: 4 [1] 146.7 --------------------------------------------------------
newdf试试这个:
> 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
试试这个:
> 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
如更新中所述,找到了使用plyr的解决方案
使用的代码是:
max_lac <- ddply(.data=df, .variables=.(ID), function(x)
+ x[which(x$lac == max(x$lac)), ])
max_lac找到了使用plyr的解决方案,如更新中所述
使用的代码是:
max_lac <- ddply(.data=df, .variables=.(ID), function(x)
+ x[which(x$lac == max(x$lac)), ])
max\u lac对于大型数据集,请尝试data.table
(假设df
是您的数据集)
对于大型数据集,请尝试使用data.table
(假设df
是您的数据集)
(如果查看ddply和which.max)
是吗
ddply(df,.ID,function(x){x[which.max(x$lac)),]}
(如果查看ddply和which.max)
是吗
ddply(df,.ID,function(x){x[which.max(x$lac)),]}
在处理大型数据集时,这里有一个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))
或
在处理大型数据集时,这里有一个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))
或
谢谢@landroni,我通过做类似的事情,在发布您的解决方案的同时成功地解决了这个问题。:)谢谢@landroni,我通过做类似的事情,在发布您的解决方案的同时成功地解决了这个问题。:)By和tapply的工作方式不同,第一个参数需要为函数使用正确的格式:tapply(df$lac,df$ID,max)
By和tapply的工作方式不同,第一个参数需要为函数使用正确的格式:tapply(df$lac,df$ID,max)
我故意没有发布这篇文章,所以你不会生我的气:)@davidernburg,太棒了,你是一个真正的团队合作者;)您可能还想在这里添加OP需要分离plyr(似乎他已经在使用它了)@Davidernburg,说得对。我现在无法测试,但我猜对于这些函数,plyr加载不会立即出现问题。此外,据我所知(但可能不推荐),如果在plyr之后加载dplyr,则可能会加载麻烦包。谢谢@初学者和@daviderburg!我没有为每个ID考虑多个最大行,这很好。如果这项试点研究成功,这在未来可能会很有用。:)我是故意不发这个帖子的,这样你就不会生我的气:)@DavidArenburg,太棒了,你是一个真正的团队成员;)您可能还想在这里添加OP需要分离plyr(似乎他已经在使用它了)@Davidernburg,说得对。我现在无法测试,但我猜对于这些函数,plyr加载不会立即出现问题。此外,据我所知(但可能不推荐),如果在plyr之后加载dplyr,则可能会加载麻烦包。谢谢@初学者和@daviderburg!我没有为每个ID考虑多个最大行,这很好。如果这项试点研究成功,这在未来可能会很有用。:)