2014-08-27 107 views
0

我有一個名爲newdata data.frame它看起來像一個列表返回一行:應用功能,從包含許多data.frames

HospitalName   State  Rating 
CRESTWOOD MEDICAL AL  3 
GEORGIANA HOSPITAL AL  7 
WEST VALLEY HOSPITAL AZ  5 
VERDE VALLEY   AZ  6 

該醫院是由國家排序,然後按評級。目前大約有50個州。

我將data.frame拆分成一個包含按狀態分隔的data.frames的列表。

s <-split(newdata,newdata[,2],drop=FALSE) 

我有一個函數,應該從列表中的單個data.frames中的第n行或頂部或底部行。 num包含行號或文字最好或最差。

rnk<- function(num = "best") { 

if(num=="best"){idx<-1} 
if(num=="worst"){idx<-nrow(s)} 

best_hospital<-data.frame(s[idx,1],s[idx,2]) 
best_hospital 

} 

我打電話給lapply()將上面的函數應用到列表中。

hospitals<- lapply(s, rnk,num=num) 

我收到錯誤

錯誤FUN(X [[1L]],...):未使用的參數(X [[1]])

所有我試圖做的是循環通過不同的data.frames並採取頂部,底部或第n行並結合。我認爲我缺少的是如何從函數內引用個別data.frames。有任何想法嗎?

+0

的第一個參數你'RNK '功能將數據幀... – Spacedman 2014-08-27 13:09:18

回答

1

您的功能定義不明確,與您正在操作的數據無關。換句話說,你的函數中的s是什麼?您沒有解析任何s。函數在本地環境中工作,所以如果不解析它,不要期望它能夠理解s。您的lapply循環中的num = num是什麼?你沒有定義任何地方num

這是你的函數應該怎麼看起來像

rnk<- function(x, num = "best") { 

    if(num=="best"){idx<-1} 
    if(num=="worst"){idx<-nrow(x)} 

    data.frame(x[idx,1],x[idx,2]) 

} 

而且你這是怎麼運行它

lapply(s, rnk) # if you want default behaviour, i.e., num = "best" 

lapply(s, rnk, "worst") # if you want to change num 

而且由於@Spacedman決定增加一個dplyr解決方案,這裏也有一個data.table解決方案

library(data.table) 
setDT(newdata) # Or newdata <- as.data.table(newdata) for older data.table versions 
newdata[, .SD[which.max(Rating)], by = State] 
# State  HospitalName Rating 
# 1: AL GEORGIANAHOSPITAL  7 
# 2: AZ  VERDEVALLEY  6 

newdata[, .SD[which.min(Rating)], by = State] 
# State  HospitalName Rating 
# 1: AL CRESTWOODMEDICAL  3 
# 2: AZ WESTVALLEYHOSPITAL  5 
+0

我有它回到醫院列表,但有沒有辦法,我可以將其轉換成一個乾淨的data.frame? – Leehbi 2014-08-27 13:28:12

+0

看我的編輯。使用'data.table'(或'dplyr')提高效率和簡單的語法 – 2014-08-27 13:30:34

+0

而不是使用額定值我需要引用num指定的特定行。 num可以包含行號或「最佳」或「最差」 – Leehbi 2014-08-27 13:37:47

1

定義rnk這樣的:

rnk = function(d, num="best"){ 
    if(num=="best"){idx<-1} 
    if(num=="worst"){idx<-nrow(d)} 
    data.frame(d[idx,1],d[idx,2]) 
} 

然後:

lapply(s, rnk, num="worst") 

lapply調用你的每個元素功能s作爲第一個參數,這裏d

當然,這種事情可能與dplyr簡單:

獲取最佳內國家組:

> require(dplyr) 
> newdata %.% group_by(State) %.% filter(Rating==max(Rating)) 
Source: local data frame [2 x 3] 
Groups: State 

    HospitalName State Rating 
1   Bar AL  7 
2   Qux AZ  6 

或者獲得最差:

> newdata %.% group_by(State) %.% filter(Rating==min(Rating)) 
Source: local data frame [2 x 3] 
Groups: State 

    HospitalName State Rating 
1   Foo AL  3 
2   Baz AZ  5