因素级别的数量排序R数据帧
问题描述:
我有三列庞大的数据帧:因素级别的数量排序R数据帧
Surgeon Length Surg. Date
John 75 2015-07-06
Max 120 2015-06-22
Max 190 2015-01-26
David 40 2015-11-04
David 25 2015-04-21
David 50 2015-12-11
Andrey 210 2015-03-15
Vincent 180 2015-01-30
Vincent 180 2015-06-10
我想根据多少次手术外科医生做了排序。如果两名外科医生做了相同数量的手术,那么手术的日期应该决定等级。 输出应该是这样的:
Surgeon Length Surg. Date
Andrey 210 2015-03-15
John 75 2015-07-06
Max 190 2015-01-26
Max 120 2015-06-22
Vincent 180 2015-01-30
Vincent 180 2015-06-10
David 25 2015-04-21
David 40 2015-11-04
David 50 2015-12-11
安德烈和约翰的名字出现在该表一次,所以它们是第一位的,但安德烈有一个较早的日期,所以他是在表中的第一个。然后来马克斯和文森特,两人都进行了两次手术。然后大卫与3
有没有一种简单的方法来做到这一点?
答
dd <- read.table(header = TRUE, text = "Surgeon Length 'Surg. Date'
John 75 2015-07-06
Max 120 2015-06-22
Max 190 2015-01-26
David 40 2015-11-04
David 25 2015-04-21
David 50 2015-12-11
Andrey 210 2015-03-15
Vincent 180 2015-01-30
Vincent 180 2015-06-10", check.names = FALSE)
我们可以设置Surgeon
的等级,使得r负责为我们排序。如果我们列表外科医生并对表格进行排序,您可以看到表格名称按照您的要求排序,因此我们只需将此顺序设置为levels(Surgeon)
的顺序,而不是缺省(按字母顺序)。
然后我们简单地添加按日期排序的附加级别。
sort(tbl <- table(dd$Surgeon))
# Andrey John Max Vincent David
# 1 1 2 2 3
对于那些有关系,我们也可以与第一日期
(lvls <- names(tbl)[order(tbl, tapply(as.Date(dd$`Surg. Date`), dd$Surgeon, min))])
# [1] "Andrey" "John" "Max" "Vincent" "David"
dd$Surgeon <- factor(dd$Surgeon, levels = lvls)
dd[order(dd$Surgeon, dd$`Surg. Date`), ]
# Surgeon Length Surg. Date
# 7 Andrey 210 2015-03-15
# 1 John 75 2015-07-06
# 3 Max 190 2015-01-26
# 2 Max 120 2015-06-22
# 8 Vincent 180 2015-01-30
# 9 Vincent 180 2015-06-10
# 5 David 25 2015-04-21
# 4 David 40 2015-11-04
# 6 David 50 2015-12-11
与@ akrun的dplyr
解决方案添加一个排序的因素,你可以做一个类似的方法有更高的效率。
library('dplyr')
dd %>%
group_by(Surgeon) %>%
mutate(n=n()) %>%
ungroup() %>%
arrange(n, Surgeon, `Surg. Date`) %>%
select(-n)
# Surgeon Length Surg. Date
# (fctr) (int) (fctr)
# 1 Andrey 210 2015-03-15
# 2 John 75 2015-07-06
# 3 Max 190 2015-01-26
# 4 Max 120 2015-06-22
# 5 Vincent 180 2015-01-30
# 6 Vincent 180 2015-06-10
# 7 David 25 2015-04-21
# 8 David 40 2015-11-04
# 9 David 50 2015-12-11
或者,如果您订购的因子水平上面一样,你可以做
dd %>% arrange(Surgeon, `Surg. Date`)
与data.table
,你仍然可以使用表/因子水平的方法和设置按键,但我不知道这是data.table方式(即,唯一的开销是这似乎是相当快的大载体的table
)
library('data.table')
dd$Surgeon <- factor(dd$Surgeon, levels = names(sort(table(dd$Surgeon))))
setDT(dd, key = c('Surgeon', 'Surg. Date'))
# Surgeon Length Surg. Date
# 1: Andrey 210 2015-03-15
# 2: John 75 2015-07-06
# 3: Max 190 2015-01-26
# 4: Max 120 2015-06-22
# 5: Vincent 180 2015-01-30
# 6: Vincent 180 2015-06-10
# 7: David 25 2015-04-21
# 8: David 40 2015-11-04
# 9: David 50 2015-12-11
不可再生;( – jangorecki