如何在R中基于另一数据框按Zone Code替换列中的NA值
解决方法:替换数据框中的NA街道名称
下面给你两种适合新手的R语言实现方式,按需选择:
方法一:使用tidyverse(dplyr)包
这种方法代码可读性强,适合后续拓展更多数据处理操作:
首先构造示例数据(如果已经有现成数据可跳过这步):
df <- data.frame( Zone_Code = c(1, 2, 3), STREET = c("St. John St.", NA, NA), stringsAsFactors = FALSE ) street_df <- data.frame( Zone_Code = c(1, 2, 3), STREET = c("St. John St.", "Roxbury St.", "MJ Ave."), stringsAsFactors = FALSE )
加载dplyr包并执行替换:
library(dplyr) # 按Zone_Code合并两个数据框,区分原街道列和完整街道列 df_updated <- df %>% left_join(street_df, by = "Zone_Code", suffix = c("_original", "_full")) %>% # 优先保留原街道的非NA值,原是NA则用完整街道值填充 mutate(STREET = coalesce(STREET_original, STREET_full)) %>% # 只保留需要的两列 select(Zone_Code, STREET)
方法二:使用基础R(无需额外安装包)
如果不想安装第三方包,用基础R函数就能完成:
同样先构造示例数据(已有数据可跳过):
df <- data.frame( Zone_Code = c(1, 2, 3), STREET = c("St. John St.", NA, NA), stringsAsFactors = FALSE ) street_df <- data.frame( Zone_Code = c(1, 2, 3), STREET = c("St. John St.", "Roxbury St.", "MJ Ave."), stringsAsFactors = FALSE )
执行替换操作:
# 找到df中每个Zone_Code在street_df里对应的位置索引 match_pos <- match(df$Zone_Code, street_df$Zone_Code) # 筛选出df中STREET为NA的行,用street_df对应位置的街道名替换 df$STREET[is.na(df$STREET)] <- street_df$STREET[match_pos[is.na(df$STREET)]]
两种方法最终得到的结果一致:
| Zone_Code | STREET |
|---|---|
| 1 | St. John St. |
| 2 | Roxbury St. |
| 3 | MJ Ave. |
内容的提问来源于stack exchange,提问作者godlytheelix
相关产品推荐
相关产品推荐

