2014-04-14 60 views
1

我有一個data.tableoutcome,它有一個名爲hospital的列。和一個名爲state的專欄。 outcome已經排序。現在我想從每個state中的第n個hospital子集(如果沒有第N個然後返回該狀態的NA)。我嘗試用下面的方法解決它(由於這是一項家庭作業,我只是向第三個分支顯示了導致錯誤的原因)。如何基於條件從列表中對行進行子集合

rankall <- function(out, num = "best"){ 
    outcome <- readdata(outcome = out) //returns a data.table sorted by rate 
    ... 
    outcome <- lapply(outcome, function(x) ifelse(num <= nrow(x), x[num,], c(NA,NA))) 
    outcome <- rbindlist(outcome) 
} 

原來outcome就像

> data 
               hospital state 
    1:        NYU HOSPITALS CENTER NY 
    2:        DOYLESTOWN HOSPITAL PA 
    3:   AVERA HEART HOSPITAL OF SOUTH DAKOTA LLC SD 
    4:     GLENDALE ADVENTIST MEDICAL CENTER CA 
    5:        WATERBURY HOSPITAL CT 
    ---               
2716:       DESERT SPRINGS HOSPITAL NV 
2717:     THREE RIVERS COMMUNITY HOSPITAL OR 
2718: ROBERT WOOD JOHNSON UNIVERSITY HOSPITAL AT RAHWAY NJ 
2719:        LAREDO MEDICAL CENTER TX 
2720:      MEDICAL CENTER SOUTH ARKANSAS AR 

與第一和第二支能產生正確的結果,這就好比

> head (data) 
           hospital state 
1:         NA AK 
2:    CRESTWOOD MEDICAL CENTER AL 
3:    ARKANSAS HEART HOSPITAL AR 
4:     MAYO CLINIC HOSPITAL AZ 
5: GLENDALE ADVENTIST MEDICAL CENTER CA 
6: ST MARYS HOSPITAL AND MEDICAL CENTER CO  
> nrow(data) 
[1] 54 

然而,第三個條件就是無法做它的工作。其產生錯誤

Error in rbindlist(outcome) : 
    Item 1 of list input is not a data.frame, data.table or list 

和調試後,我發現該條件後的結果是一樣的東西(這導致錯誤在最後一步)

$AK 
[1] NA 

$AL 
$AL[[1]] 
[1] "HIGHLANDS MEDICAL CENTER" 

不同於前兩者是像...

> head(data,2) 
$AK 
          hospital state 
1: PROVIDENCE ALASKA MEDICAL CENTER AK 

$AL 
        hospital state 
1: CRESTWOOD MEDICAL CENTER AL 

所以我想知道第三個分支有什麼問題。 任何人都可以幫助我,非常感謝!

順便說一句,我不知道我是否可以引用與他人同名的變量。例如,當我撥打readdata時,我需要傳遞一個名爲outcome的參數,它阻止我使用此名稱作爲rankall函數的參數(我改爲使用out)。我知道在JAVA this.outcome將有所幫助,所以在R怎麼樣。

+2

這是Coursera的轉讓,R編程過程所以要小心不要違反榮譽代碼,在你測試條件之前,如果你將它們轉換爲數字等價物,if(num ==「best」index == 1,if(num ==「worst」)index = nrow(x)'' else index = as.numeric(num)' – OdeToMyFiddle

+0

對不起,我通過隱藏一些細節而改變了,現在可以嗎?謝謝你的幫助!順便說一句,你能解決我有關命名空間的最後一個問題嗎? – Tebyt

+0

國家AK的NA可能可能表明這個partic ular疾病AK沒有醫院覆蓋它,您可以通過僅爲AK設置結果數據來驗證這一點。關於'命名'問題,默認情況下,參數在位置上是匹配的,所以在rankall函數中,'rankall(結果=結果,...「是完全有效的語句 – OdeToMyFiddle

回答

0

謝謝你的Vivek的幫助,我現在已經明白了。 首先是關於第三個分支的錯誤表現。如果我首先使用as.numeric(num)num轉換爲數字,它將正常工作。我認爲這是因爲num被認爲是一個角色(因爲它有可能導致錯誤的「最好」和「最差」值)。然而,關於命名空間的第二點卻很奇怪。雖然在我自己的測試中表現不佳,但在Vivek回答我的問題之後,它才起作用。所以,這意味着我們可以使用下面的代碼,R會給我們正確的結果。

rankall <- function(outcome, num = "best"){ 
    outcome <- readdata(outcome = outcome) 
0

下面這個輸出一個警告信號,結果的第一元件僅僅是NA,原子,其被強制與第二元件「綁定」,這由功能rbindlist

$AK 
[1] NA 

$AL 
$AL[[1]] 
[1] "HIGHLANDS MEDICAL CENTER" 
是一個列表 $AL[[1]]

可能的解決方案:

一種方法是在所有三種情況下輸出data.framelistif條件塊例如與data.frame,一旦num是數字,以下應該在所有情況下,最好,最差和中間行工作。

sapply(outcome, function(x) data.frame(state=x[num,"state"],hospital=x[num,"hospital"]) 

與沒有匹配的醫院列應該有一個NA的情況下,能否請你檢查,如果這個工程

+0

它確實有效。我認爲你的第一個解決方案在某種程度上更簡單 – Tebyt

相關問題