使用dplyr将数据框NA值替换为同表关联城市的行程时长
用最近城市的行程时长填充NA值的解决方案
我来帮你搞定这个问题!下面我会用两种常用的R方法来实现你的需求:用closest列对应的城市的同目的地时长,替换原城市的NA值。
第一步:先模拟你的数据
首先我们先构造和你描述一致的示例数据框:
df <- data.frame( city = c("cityA", "cityB", "cityC", "cityD"), dest1 = c(NA, NA, 100, 300), dest2 = c(NA, NA, 200, 400), closest = c("cityC", "cityD", "cityA", "cityB"), stringsAsFactors = FALSE )
方法一:用dplyr(tidyverse风格)
如果你习惯用tidyverse工具链,这个方法更清晰易读:
library(dplyr) df_filled <- df %>% # 把原数据的城市和对应时长提取出来,重命名用于连接 left_join(df %>% select(city, dest1_closest = dest1, dest2_closest = dest2), by = c("closest" = "city")) %>% # 用coalesce函数:如果原dest值不是NA就保留,否则用最近城市的对应值 mutate( dest1 = coalesce(dest1, dest1_closest), dest2 = coalesce(dest2, dest2_closest) ) %>% # 移除临时生成的辅助列 select(-dest1_closest, -dest2_closest)
运行后df_filled的结果就是你想要的:
city dest1 dest2 closest 1 cityA 100 200 cityC 2 cityB 300 400 cityD 3 cityC 100 200 cityA 4 cityD 300 400 cityB
方法二:用Base R(无需额外包)
如果你不想加载额外的包,用Base R的match函数也能快速实现:
# 处理dest1列 df$dest1 <- ifelse(is.na(df$dest1), df$dest1[match(df$closest, df$city)], df$dest1) # 处理dest2列 df$dest2 <- ifelse(is.na(df$dest2), df$dest2[match(df$closest, df$city)], df$dest2)
这里match(df$closest, df$city)会返回每个closest城市在原数据框中的行索引,然后用这个索引提取对应的时长值,替换原列的NA。
内容的提问来源于stack exchange,提问作者Syd
相关产品推荐
相关产品推荐

