在数据框中查找行,其中最大值按另一列中的值分组

时间:2013-05-18 18:15:28

标签: r

我想在不使用SQL的情况下解决R中的这个问题。

How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?

当然,我可以使用sqldf来完成它,但是在R中必须有一个很酷的应用方法吗?

2 个答案:

答案 0 :(得分:7)

设置数据首先读入数据:

Lines <- "id  home  datetime  player   resource
1   10   04/03/2009  john    399 
2   11   04/03/2009  juliet  244
5   12   04/03/2009  borat   555
3   10   03/03/2009  john    300
4   11   03/03/2009  juliet  200
6   12   03/03/2009  borat   500
7   13   24/12/2008  borat   600
8   13   01/01/2009  borat   700
"
DF <- read.table(text = Lines, header = TRUE)
DF$datetime <- as.Date(DF$datetime, format = "%d/%m/%Y")

1)base - by 有很多方法可以使用各种软件包来处理这个问题但是我们先在这里展示一个基本解决方案:

> do.call("rbind", by(DF, DF$home, function(x) x[which.max(x$datetime), ]))
   id home   datetime player resource
10  1   10 2009-03-04   john      399
11  2   11 2009-03-04 juliet      244
12  5   12 2009-03-04  borat      555
13  8   13 2009-01-01  borat      700

1a)base - ave 和变体(也只使用R的基数):

FUN <- function(x) which.max(x) == seq_along(x)
is.max <- ave(xtfrm(DF$datetime), DF$home, FUN = FUN) == 1
DF[is.max, ]

2)sqldf ,这里使用sqldf以防万一:

> library(sqldf)
> sqldf("select id, home, max(datetime) datetime, player, resource 
+        from DF 
+        group by home")
  id home   datetime player resource
1  1   10 2009-03-04   john      399
2  2   11 2009-03-04 juliet      244
3  5   12 2009-03-04  borat      555
4  8   13 2009-01-01  borat      700

答案 1 :(得分:1)

我也不使用SQL,所以我会这样做。

1)

df <- read.table("your file", "your options") # I leave this to you

2)

row_with_max_value <- max(which(df$values & df$group_column=="desired_group"))

“row_with_max_value”包含数据框的行号(df),其中您可以找到按“group_column”分组的列“值”(df $值)的最大值。 如果“group_column”不是字符类型,请删除引号并使用相应的文本格式。

如果您需要值,而不是

df$values[row_with_max_value]

可能它不是最优雅的方式,但你不需要SQL而且它有效(至少对我而言);