【问题标题】:Apply a function to return a row from a list containing many data.frames应用函数从包含许多 data.frames 的列表中返回一行
【发布时间】:2014-08-27 21:48:35
【问题描述】:

我有一个名为 newdata 的 data.frame,它看起来像:

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

医院按州排序,然后按等级排序。目前约有 50 个州。

我将 data.frame 拆分为一个列表,其中包含由 State 分隔的 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。有任何想法吗?

【问题讨论】:

  • rnk 函数的第一个参数将是数据框...

标签: r


【解决方案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

【讨论】:

  • 我让它返回一个医院列表,但有没有办法可以将它转换成一个干净的 data.frame?
  • 查看我的编辑。使用data.table(或dplyr)既高效又简单
  • 我需要参考数字所指示的特定行,而不是使用评级。 num 可以包含行号或“最佳”或“最差”
【解决方案2】:

这样定义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")

lapplys 中的每个元素调用您的函数作为其第一个参数,此处为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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    相关资源
    最近更新 更多