Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R aggregate()按组使用某些函数(例如max),但在其他列上投影_R_Aggregate_Greatest N Per Group - Fatal编程技术网

R aggregate()按组使用某些函数(例如max),但在其他列上投影

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

给定一个包含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-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)