簡體   English   中英

按因子數量級別對R數據幀進行排序

[英]Sorting R data frame by number of factors levels

我有三個巨大的數據框:

   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

安德烈和約翰的名字出現在桌子上,所以他們先來,但是安德魯有一個更早的約會,因此他是表中的第一個。 然后來到馬克斯和文森特,兩人都進行了2次手術。 然后大衛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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM