应用多个参数,重载
Apply with multiple arguments, overloading
我有一个由诊所组成的数据集,每个诊所都由医生组成,对患者进行手术。
我已经写过对诊所列表或医生列表的数据集过滤进行分析(下面是一个简单的):
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)
然而,该函数仅在传递 'first' 参数时起作用,即上面的函数不起作用,但是这样做:
sapply(clinic_list, num.of, x.doctor = NULL)
如果在编写初始函数时将参数颠倒,则与上述示例相反。
函数一次只输入一组参数:x.doctor 的列表或 x.clinic 的列表。
请问我如何重写我的函数,以便 apply 工作 x.clinic 并在 x.doctor 的单独函数调用中工作?
谢谢!
试试这个:
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
,这是一个好习惯(在 "Best Practices TM" 中)。
如果这不起作用,那么您可能需要再制作一个 reproducible example 以便我们实际测试该功能。由于您可能不想包含实际数据,如果您使用简单的名称和简单的示例数据使其一如既往地通用,那么对于其他人来说事情会变得非常容易。
我有一个由诊所组成的数据集,每个诊所都由医生组成,对患者进行手术。
我已经写过对诊所列表或医生列表的数据集过滤进行分析(下面是一个简单的):
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)
然而,该函数仅在传递 'first' 参数时起作用,即上面的函数不起作用,但是这样做:
sapply(clinic_list, num.of, x.doctor = NULL)
如果在编写初始函数时将参数颠倒,则与上述示例相反。
函数一次只输入一组参数:x.doctor 的列表或 x.clinic 的列表。
请问我如何重写我的函数,以便 apply 工作 x.clinic 并在 x.doctor 的单独函数调用中工作?
谢谢!
试试这个:
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
,这是一个好习惯(在 "Best Practices TM" 中)。
如果这不起作用,那么您可能需要再制作一个 reproducible example 以便我们实际测试该功能。由于您可能不想包含实际数据,如果您使用简单的名称和简单的示例数据使其一如既往地通用,那么对于其他人来说事情会变得非常容易。