3

我有一个如下所示的数据框

col1    col2    col3
A       Z       10
A       Y       8
A       Z       15
B       X       11
B       Z       7
C       Y       10
D       Z       11
D       Y       14
D       L       16

我必须选择,对于每个distinct col1col2max(col3)

输出数据框应如下所示,

col1    col2    col3
A       Z       15
B       X       11
C       Y       10
D       L       16

如何在R或在SQL

提前致谢

4

3 回答 3

4

我们可以使用data.table. 我们将 'data.frame' 转换为 'data.table' ( setDT(df1)),按 'col1' 分组,我们.SD根据 'col3' 的最大值索引对 data.table ( ) 进行子集化

library(data.table)
setDT(df1)[, .SD[which.max(col3)], col1]
#     col1 col2 col3
#1:    A    Z   15
#2:    B    X   11
#3:    C    Y   10
#4:    D    L   16

或者我们可以在按 'col1' 分组后使用top_nfrom 。dplyr

library(dplyr)
df1 %>%
      group_by(col1) %>%
      top_n(1)
于 2015-11-18T10:12:52.740 回答
3

在 MySQL 中做的另一种方式。

这是SQLFiddle 演示

输出:=>在此处输入图像描述

SELECT T1.*
FROM
table_name T1
INNER JOIN 
(SELECT col1,MAX(col3) AS Max_col3 FROM table_name GROUP BY col1) T2 
            ON T1.`col1` = T2.`col1` and T2.`Max_col3`=t1.`col3`

希望这可以帮助。

于 2015-11-18T10:44:44.220 回答
3

SQL 答案:

NOT EXISTS如果没有具有相同 col1 值且具有更高 col3 值的其他行,则用于返回一行。

select *
from tablename t1
where not exists (select 1 from tablename t2
                  where t2.col1 = t1.col1
                    and t2.col3 > t1.col3)

如果有 max(c3) 领带,将返回 col1 的两行。

于 2015-11-18T10:24:39.703 回答