【发布时间】:2019-07-02 20:05:49
【问题描述】:
我正在寻找有关如何提高我的 r 脚本中长 if/else 循环的效率的建议。我还希望尽可能地适应未来,因为它的范围可能会随着时间而改变。
背景
使用其他语言的遗留代码,我正在自动化一个大型项目的报告流程。在这个项目中,我有多个“中心”来创建基于数据库子集的报告。现在,我使用如下所示的长示例循环来完成此操作:
df$ReportName <- 0
df$new_centername[is.na(df$new_centername)] <- 0
for (i in 1:nrow(df)){
if (df$new_centername[i] == 1){
df$ReportName[i] <- "Center A"
} else if (df$new_centername[i] == 2){
df$ReportName[i] <- "Center B"
} else if (df$new_centername[i] == 3){
df$ReportName[i] <- "Center C"
} else if (df$new_centername[i] == 4){
df$ReportName[i] <- "Center D"
} else if (df$new_centername[i] == 5){
df$ReportName[i] <- "Center E"
} else if (df$new_centername[i] == 6){
df$ReportName[i] <- "Center F"
}
...
df是通用数据框,new_centername指定该行数据属于哪个Center,全部用数字编码。
随着时间的推移,我预计会添加更多的中心。我假设有一种方法可以将这些中心存储在一个列表中,然后创建一个遍历列表的循环。这样,在添加新中心时,我只需将它们的名称添加到列表中。
编辑:
- “中心__”在这里只是一个占位符,实际中心名称差异很大。
- 数字 ID 也不遵循直线模式。
建议的解决方案:
SampleList <- list("Center A", "Center B", "Center C", ...)
for (i in 1:nrow(df)){
for (j in 1:length(SampleList)){
if (df$new_centername[i] == 1){
df$ReportName[i] <- SampleList[j]
}
}
}
非常感谢帮助我围绕最佳逻辑和适当的语法进行优化! 谢谢
【问题讨论】:
-
你可以使用
ifelse,它是矢量化的,不需要循环 -
@Sotos 感谢您的反馈!我过去使用过矢量化 ifelse,但由于我有超过 60 个唯一标识符,因此这种格式同样会让人感到困惑。这就是为什么我正在寻找一个可以跨列表映射的更通用的解决方案。
标签: r loops vectorization