我有一个由诊所组成的数据集,每个诊所都由医生组成,对病人进行手术。
我写过对临床列表或医生名单的数据集过滤进行分析(下面是一个简单的分析):
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的单独函数调用?
谢谢!
答案 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,以便我们可以实际测试该功能。由于您可能不想包含实际数据,因此如果您使用简单的名称和简单的示例数据进行通用操作,那么对于其他人来说,事情会变得非常容易。