2016-04-03 87 views
2

我有三列龐大的數據幀:因素級別的數量排序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

有沒有一種簡單的方法來做到這一點?

+0

不可再生;( – jangorecki

回答

7
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 
+0

@DavidAr enburg查看數據表編輯,你會怎麼做? – rawr

+0

外科醫生進行1次手術時不起作用,然後按名稱和日期排序。例如,如果我們切換安德烈和約翰的約會,安德烈仍然是排名第一的。 – Lanza

+0

對於data.table方法,您可以將級別設置爲'DT [,。(。N,min(Surg.Date)),by =外科醫生] [order(N,V2),外科醫生]' – Frank