2015-04-30 2 views
1

У меня есть «EMP» набор данных с именем, класса и стоимости (на основе обратной связи менеджера)Совокупный() - R - это можно замаскировать один из агрегированных столбцов из отображения и добавив еще один столбец

name grade value 
1 Ram  R 2.1 
2 Sam  R 2.4 
3 Jam  R 5.3 
4 Bill  S 4.2 
5 Claw  S 3.6 
6 Men  S 1.2 
7 Jay  P 5.3 
8 Kay  P 3.8 
9 Ray  P 3.2 

с aggregate(value ~ grade, data = emp, FUN=min) я получил минимальное значение для каждого класса

grade value 
1  P 3.2 
2  R 2.1 
3  S 1.2 

на основе минимального значения, я хотел, чтобы отобразить только класс и имя, но не столбец значения. Возможно ли это с aggregate() в R.

+0

http://stackoverflow.com/ вопросы/6289538/aggregate-a-dataframe-on-a-given-column-and-display-another-column – germcd

ответ

2

Вот возможный подход

library(data.table) 
setDT(emp)[, .(name = name[which.min(value)]), by = grade] 
# grade name 
# 1:  R Ram 
# 2:  S Men 
# 3:  P Ray 

Вот еще

library(dplyr) 
emp %>% 
    group_by(grade) %>% 
    summarise(name = name[which.min(value)]) 

# Source: local data table [3 x 2] 
# 
# grade name 
# 1  R Ram 
# 2  S Men 
# 3  P Ray 

Или с основанием R

do.call(rbind, by(emp, emp$grade, 
        function(x) data.frame(grade = as.character(x$grade[1L]), 
             name = x$name[which.min(x$value)]))) 
# grade name 
# P  P Ray 
# R  R Ram 
# S  S Men 
+0

Ваши усилия оценил, но мои вопросы заключались в том, что нельзя использовать функцию aggregate() для выполнения того же самого? – srivatsa

+0

Я так не думаю. Почему вы настаиваете на «агрегате»? –

+0

Это неправильный инструмент. Функции 'aggregate' только« видят »один вектор за раз, поэтому у них нет необходимых данных для работы над двумя столбцами. Базовая парадигма будет «lapply (split (,), FUN)». –

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