Найти второе наибольшее значение в кадре данных в R - PullRequest
0 голосов
/ 03 июля 2018

Здравствуйте, для приведенного ниже фрейма данных в R, могу ли я узнать самую простую команду (без использования какой-либо дополнительной библиотеки, такой как deplyr), как найти второй по величине оклад и сохранить имя сотрудника в переменной с именем 2nd_high_employee?

EmployeeID  EmployeeName    Department      Salary   
----------- --------------- --------------- ---------
1           T Cook          Finance         40000.00
2           D Michael       Finance         25000.00
3           A Smith         Finance         25000.00
4           D Adams         Finance         15000.00
5           M Williams      IT              80000.00
6           D Jones         IT              40000.00
7           J Miller        IT              50000.00
8           L Lewis         IT              50000.00
9           A Anderson      Back-Office     25000.00
10          S Martin        Back-Office     15000.00
11          J Garcia        Back-Office     15000.00
12          T Clerk         Back-Office     10000.00

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Использование базы R: Найти 2-ую самую высокую зарплату:

если вам нужно подмножество без учета отдела:

subset(dat,sort(z<-rank(Salary),T)[2]==z)
  EmployeeID EmployeeName Department Salary
7          J       Miller         IT  50000
8          L        Lewis         IT  50000

с учетом отдела:

unsplit(by(dat,dat$Department,function(x)subset(x,(y<-rank(Salary))==sort(y,T)[2])),rep(1:3,each=2))   

   EmployeeID EmployeeName  Department Salary
10          S       Martin Back-Office  15000
11          J       Garcia Back-Office  15000
2           D      Michael     Finance  25000
3           A        Smith     Finance  25000
7           J       Miller          IT  50000
8           L        Lewis          IT  50000

Только для имени сотрудника:

as.character(subset(dat,sort(z<-rank(Salary),T)[2]==z)[,2])
[1] "Miller" "Lewis"
0 голосов
/ 03 июля 2018

В следующий раз вы можете опубликовать образец ваших данных, используя head (dput (x)), чтобы облегчить членам SO чтение ваших данных.

df <- read.table(text = "
EmployeeID  EmployeeName    Department      Salary   

1           T Cook          Finance         40000.00
2           D Michael       Finance         25000.00
3           A Smith         Finance         25000.00
4           D Adams         Finance         15000.00
5           M Williams      IT              80000.00
6           D Jones         IT              40000.00
7           J Miller        IT              50000.00
8           L Lewis         IT              50000.00
9           A Anderson      Back-Office     25000.00
10          S Martin        Back-Office     15000.00
11          J Garcia        Back-Office     15000.00
12          T Clerk         Back-Office     10000.00", header = T)


second_high_employee <- tail(sort(df$Salary),2)[1]
second_high_employee 
[1] 50000

Кстати, имя объекта нельзя начинать с цифры. Вы можете проверить: ?make.names

Также для каждого отдела вы можете сделать:

aggregate(Salary ~ Department, df, function(x) {tail(sort(x), 2)[1]})
   Department Salary
1 Back-Office  15000
2     Finance  25000
3          IT  50000

В случае, если было 2 верхних оклада в 80000, и вы хотели снова найти второе по величине из 50000, вы могли бы заключить x или df$Salaray в tail(sort(unique()), 2)[1]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...