【问题标题】:Find the second highest value in data frame in R在R中查找数据框中的第二高值
【发布时间】:2018-07-03 06:57:56
【问题描述】:

您好,对于 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

【问题讨论】:

标签: r


【解决方案1】:

下次您可以考虑使用 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 的第二高薪水,则可以将 xdf$Salaray 包裹在 tail(sort(unique()), 2)[1]

【讨论】:

  • 非常感谢您的回复,这很有帮助,但是考虑到只有 1 名员工的薪水为 50K,考虑到我使用您的命令获取第二高的薪水,我将如何打印他的名字?
  • df[df$Salary %in% tail(sort(df$Salary),2)[1],]
  • 如果您只想打印姓名,可以添加$EmployeeName
  • 给我 NA 值的警告:警告消息:在 is.na(x) 中:is.na() 应用于“NULL”类型的非(列表或向量)[1] emp_id emp_name 工资 start_date (或 0-length row.names)
  • df[df$Salary %in% tail(sort(df$Salary),2)[1],] 提供了什么?
【解决方案2】:

使用Base R:找到第二高的薪水:

如果您需要子集而不考虑部门:

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"

【讨论】:

  • subset(dat,sort(z
  • 非常感谢..干杯!!
  • 假设我只想添加 IT 部门员工的薪水..查询会是什么?
猜你喜欢
  • 2018-03-23
  • 2021-03-25
  • 2023-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 2021-02-11
相关资源
最近更新 更多