R aggregate()按组使用某些函数(例如max),但在其他列上投影
给定一个包含ID列、Value列和Date列的数据帧,我将执行以下操作:对于每个ID(按ID分组),返回具有最高值的行的日期R aggregate()按组使用某些函数(例如max),但在其他列上投影,r,aggregate,greatest-n-per-group,R,Aggregate,Greatest N Per Group,给定一个包含ID列、Value列和Date列的数据帧,我将执行以下操作:对于每个ID(按ID分组),返回具有最高值的行的日期 > df <- data.frame(ID=c(101, 101, 101, 202), Date=c("2013-04-12", "2013-06-21", "2013-07-06", "2013-07-06"), Value=c(3.4, 5.8, 4.2, 2.1)) > df ID Date Value 1 101 2013-0
> df <- data.frame(ID=c(101, 101, 101, 202), Date=c("2013-04-12", "2013-06-21", "2013-07-06", "2013-07-06"), Value=c(3.4, 5.8, 4.2, 2.1))
> df
ID Date Value
1 101 2013-04-12 3.4
2 101 2013-06-21 5.8
3 101 2013-07-06 4.2
4 202 2013-07-06 2.1
我知道如何使用aggregate()按ID获取最大值,但如何返回日期列而不是实际聚合的最大值?当您希望将函数应用于由另一列索引的列时,最好选择tapply
tapply(df[,2],df[,1],max)
tapply
返回向量或列表,因此有时需要进行一些后处理
编辑:哎呀,误读了。所以你有一个列,你想根据索引,ID
取最大值,value
,但是你真的想要最大值的日期吗
这有点复杂,最好用顺序
和重复
来解决。第一个将对数据进行排序,以便每个用户中的最高值排在第一位,然后可以使用重复的删除额外的观察值
ind = order(df$ID,df$Value,decreasing=TRUE)
df = df[ind,]
df[!duplicated(df$ID),]
这有点落后,但我认为它会起作用。如果您的数据集较大,这里有一个数据表方法:
library(data.table)
df <- data.table(df)
df[ , Date[which.max(Value)], by=ID]
ID V1
1: 101 2013-06-21
2: 202 2013-07-06
我能找到的最简单的方法是使用库(sqldf),用R语言说SQL
> library(sqldf)
> sqldf('select * from df group by ID having Value = max(Value)')
ID Date Value
1 101 2013-06-21 5.8
2 202 2013-07-06 2.1
在mac中安装sqldf有点棘手。无论如何,用R语言说SQL会让事情变得更简单。以下是我的程序:
install.packages("sqldf")
options(gsubfn.engine = "R")
packageVersion("gsubfn")
library(RSQLite.extfuns)
library(DBI)
library(RSQLite)
library(proto)
library(gsubfn)
library(sqldf)
谢谢你的答复,但我认为这正是我所需要的。首先,我想你指的是tapply(df[,3],df[,1],max)(你的版本给出了一个“max对因子没有意义”的错误)。其次,我对实际的最大值不感兴趣。我需要最大值(第3列)的日期(第2列)。如何做到这一点?它应该足够好,可以在Mac上安装标准的R发行版(已经随TtclTk提供),然后像其他任何软件包一样安装.packages(“sqldf”)
。tcltk曾一度没有标准的Mac发行版,但现在已经有一段时间没有了。仍然可能出现的主要问题是,如果您进行了R的自定义安装,并告诉它忽略tcltk。在这种情况下,请重新安装R的标准版本。
> library(sqldf)
> sqldf('select * from df group by ID having Value = max(Value)')
ID Date Value
1 101 2013-06-21 5.8
2 202 2013-07-06 2.1
install.packages("sqldf")
options(gsubfn.engine = "R")
packageVersion("gsubfn")
library(RSQLite.extfuns)
library(DBI)
library(RSQLite)
library(proto)
library(gsubfn)
library(sqldf)