我想在不使用SQL的情況下在R中解決此問題。在數據框中查找行,最大值按另一列中的值分組
How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?
當然,我可以用sqldf做到這一點,但必須有一個很酷的應用方法R中做到這一點,太?
我想在不使用SQL的情況下在R中解決此問題。在數據框中查找行,最大值按另一列中的值分組
How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?
當然,我可以用sqldf做到這一點,但必須有一個很酷的應用方法R中做到這一點,太?
設置數據首先讀取的數據:
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)基地 - 由有許多方法來處理這個使用各種軟件包,但在這裏,我們首先會顯示一個基礎的解決方案:
> 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)的基極 - 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
我不使用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)的行號,在其中找到的列的最大值 「的值」 (df $值)按「group_column」分組。 如果「group_column」不是字符類型,請刪除引號並使用相應的文本格式。
如果您需要的值,比
df$values[row_with_max_value]
也許這不是最優雅的方式,但你並不需要SQL,它工作(至少對我來說)
我不知道什麼是「獨特的」,但是'x [which.max(x $ var),]'做了另一部分。 – Frank
酷 - 謝謝!我從未使用過which.max。太好了! – Don