2015-11-18 1 views
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 col1 который из выходного кадра данных col2 имеет max(col3)

должен выглядеть,

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

Как это сделать либо в R или в SQL

Заранее спасибо

+0

Как вы хотите обращаться с галсами? –

+0

Также 'library (data.table); уникальный (setorder (setDT (df), -col3), by = "col1") ', хотя, как уже упоминалось, неясно, как вы хотите обрабатывать связи. –

+0

Для подхода dplyr, который возвращает строку sinlge для каждой группы (также в случае связей), см. Https://stackoverflow.com/questions/21308436 –

ответ

4

Мы можем использовать data.table. Превратим 'data.frame' в 'data.table' (setDT(df1)), сгруппированных по 'col1', мы Подмножество в data.table (.SD) на основе индекса максимального значения 'COL3'

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 

Или мы можем использовать top_n от dplyr после группировки 'col1'.

library(dplyr) 
df1 %>% 
     group_by(col1) %>% 
     top_n(1) 
+0

Большое спасибо за быстрый ответ. :) Это не позволяет принять ваш ответ так быстро, как вы ответили. –

+0

@ManojG Спасибо за отзыв. Я думаю, что это займет около 10 минут. – akrun

+0

Ваши решения в dplyr и data.table будут отличаться в случае связей. Просто скажу –

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) 

Вернет обе строки для col1, если имеется макс (c3).

3

Другой способ сделать в MySQL.

Вот SQLFiddle Demo

Выход: =>enter image description here

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` 

Надеется, что это помогает.

+0

Если вы удалите col2 из подзапроса, ваш ответ будет совместимым с ANSI SQL и переносимым! – jarlh

+0

Спасибо за информацию –

+0

@SubinCPoonamgode: Спасибо за ваше решение, но в случае связей он даст несколько строк na! –

 Смежные вопросы

  • Нет связанных вопросов^_^