使用多个参数应用,重载

时间:2016-08-15 15:57:57

标签: r dataset

我有一个由诊所组成的数据集,每个诊所都由医生组成,对病人进行手术。

我写过对临床列表或医生名单的数据集过滤进行分析(下面是一个简单的分析):

num.of <- function(x.doctor, x.clinic){


if (!missing(x.clinic)){
    df_filter <- filter(df_clean, clinic == x.clinic)
  }
  if (!missing(x.doctor)) {
    df_filter <- filter(df_clean, doctor == x.doctor)
  }
  num_doctor <- length(unique(df_filter$doctor))
  num_surveys <- nrow(df_filter)
  num_procedure <- length(unique(df_filter$PPID))
  result <- setNames(c(num_doctor, num_surveys, num_procedure), c("num_doctor", "num_surveys", "num_procedure"))
  return(result)
}

我试图通过 医生列表或诊所列表来调用这些功能:

sapply(doctor_list, num.of, x.clinic = NULL)

但是,该功能仅在“第一个”时起作用。参数传递,即上面的函数不起作用,但这样做:

sapply(clinic_list, num.of, x.doctor = NULL)

如果在编写初始函数时反转参数,则与上述示例相反。

这些函数一次只能输入一组参数:x.doctor的列表或x.clinic的列表。

如何重写我的函数,以便应用x.clinic和x.doctor的单独函数调用?

谢谢!

1 个答案:

答案 0 :(得分:0)

试试这个:

num.of <- function(x, data, type = c("doctor", "clinic")) {
  type <- match.arg(type)
  df_filter <-
    if (type == "doctor") {
      filter(data, doctor == x)
    } else {
      filter(data, clinic == x)
    }
  num_doctor <- length(unique(df_filter$doctor))
  num_surveys <- nrow(df_filter)
  num_procedure <- length(unique(df_filter$PPID))
  result <- setNames(c(num_doctor, num_surveys, num_procedure), c("num_doctor", "num_surveys", "num_procedure"))
  return(result)
}

这可以实现明确而明确的通话:

sapply(doctor_list, num.of, data = df_clean, type = "doctor")
sapply(clinic_list, num.of, data = df_clean, type = "clinic")

我冒昧地帮助范围违规:从函数内部访问df_clean可能有效,但将来会出现问题。它使得函数非常依赖于上下文,并且在存在多个数据集时不灵活。即使你100%肯定,在这种情况下你总是总是在你的呼叫(或全球)环境中拥有df_clean,这是一个好习惯(在“最佳实践 TM ”中)。

如果这不起作用,那么您可能需要制作更多reproducible example,以便我们可以实际测试该功能。由于您可能不想包含实际数据,因此如果您使用简单的名称和简单的示例数据进行通用操作,那么对于其他人来说,事情会变得非常容易。