2016-12-15 53 views
0

假設我有,我已經根據率排序,使得它現在看起來是這樣的一個數據幀:的R - 功能根據等級獲取價值

Name Rate 
A  10  
D  11  
C  11  
E  12  
B  13  
F  14  

我試圖寫一個函數,作爲參數的等級值(例如等級= 2)並輸出相應的名稱,使得如果等級中存在關係,則會輸出按字母順序排列的名稱。

在這種情況下,數據應看起來像這樣:

Name Rate Rank 
A  10  1 
C  11  2 
D  11  3 
E  12  4 
B  13  5 
F  NA  6 

使得秩= 2將輸出 「C」(未d) 和秩= 5將輸出 「B」

假設功能的級別輸入被稱爲「民」,這是我一直試圖做的事:

rankName <- df[!is.na(df[,2]),] 
    rankName <- sort(rankName[,2],) #sorting according to Rate 
    rank<-seq(1,length(rankName),by=1) #creating a sequence for rank 
    rankName <- cbind(rankHosp,rank) #combining rankName & rank seq. 
    comp <- rankName[rankName[,3]==num,] #finding rate value where rank = num 
rankName <- rankName[rankName[,2]==comp,] #finding rows where rates are 
              #equal at that rank 
    rankName<-rankName$Name #extracting by Name 

     if (length(rankName)>1){ 
       rankName <- sort(rankName) 
       rankName <- rankName[1] 
     } 

,我發現了以下錯誤:

Error in `[.data.frame`(rankName, , 3) : undefined columns selected 

我假設,無論我的錯誤,有一個簡單得多的方法來完成這個,但我一直沒能弄明白。

任何意見表示讚賞。謝謝!

+0

'get_rank < - function(r)sort(df $ Name [match(df $ Rate,unique(df $ Rate))== r])[1]'?每個值的期望輸出是多少? – alistaire

+0

我希望它輸出與排名相對應的名稱,因此對於排名= 2,它將是「C」,對於排名5,它將是「B」等。 –

+0

因此rank = 3是否存在? – alistaire

回答

0

這樣做是使用基地::秩(),然後使用包,比如dplyr

df<- read.table(header = T, text = "Name Rate 
A  10  
D  11  
C  11  
E  12  
B  13  
F  14") 

df$rnk<- rank(df$Rate, na.last = T,ties.method = "average")  
df  

require(dplyr) 
finaldf<- df %>% group_by(rnk) %>% mutate(Rank=floor(rnk)+ order(Name)-1) %>% 
    as.data.frame %>% select(c(Name,Rate,Rank))  

finaldf 

第一RNK使用平均創建提供分組功能的一種方式,所以我們通過使用這些平均GROUP_BY對於名字D和C來說,將是2.5。