2014-08-27 102 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