r - 使用 dplyr 过滤邮政编码前缀错误的更快方法
问题描述
我有一个包含邮政编码和状态列(等等)的数据集。它很大但并不可怕(4M 行,70 列),但过滤错误的观察需要很长时间。具体来说,我试图放弃邮政编码与州不相加的观察结果(例如,新泽西州邮政编码以 0 开头,但数据中的许多邮政编码以 7 开头)。这是我目前的方法,但我相信必须有更快的方法。我们欢迎所有的建议!
df_clean <- df_tmp %>%
filter(!(startsWith(zip, c("7", "8")) & state == "NJ")) %>%
filter(!(startsWith(zip, c("0", "1")) & state == "FL")) %>%
filter(!(startsWith(zip, "4") & state == "ME")) %>%
filter(!(startsWith(zip, c("1", "2")) & state == "MA")) %>%
filter(!(startsWith(zip, "6") & state == "CT"))
我希望它是不言自明的,但如果样本数据集会有所帮助,请告诉我。谢谢!
解决方案
问题是,如果数据框很大,每个过滤器都会删除一部分,然后将仍然很大的数据集传递给下一个过滤器,所以它会变慢。
如果您可以将所有条件组合在一个过滤器表达式中,它将运行得更快。像这样:
df_clean <- df_tmp %>%
filter(
!(startsWith(zip, c("7", "8")) & state == "NJ") |
!(startsWith(zip, c("0", "1")) & state == "FL") |
!(startsWith(zip, "4") & state == "ME") |
!(startsWith(zip, c("1", "2")) & state == "MA") |
!(startsWith(zip, "6") & state == "CT")
)
不要费心在 | 之前用 () 包围 & 表达式,因为 | 反正优先级较低。这样你的表达就变得更具可读性。
推荐阅读
- asp.net-core - 自定义 FluentValidation .net 核心 Web 模型状态行为
- json - 带有包含的 json 格式查询
- google-bigquery - 在 BigQuery 中查找唯一列作为行索引
- reactjs - 如果道具具有动态名称,则使用 PropTypes 验证道具
- asp.net-mvc - 如何将 html 实体放入 Asp.net mvc Html helper EditorFor placeholder
- postgresql - 如何在 postgresql 数据库中创建具有一列枚举数据类型的表?
- javascript - 错误:找不到模块“css-selector-tokenizer”
- android - 导航架构组件缓存 webview 内容
- c - 循环链表节点添加期间链表开头的分段错误11
- ios - PassKit - 从 iOS 应用程序读取电子钱包登机牌