【问题标题】:R : Filling in missing values in a column based on other columnsR :根据其他列填充一列中的缺失值
【发布时间】:2020-01-27 20:07:10
【问题描述】:

我有一个大型数据集,其中每个邮政编码都有对应的纬度和经度。在数据集中缺少一些邮政编码。我需要根据未丢失数据的相应纬度来填写丢失的邮政编码。 在此示例中,我希望第 4 行和第 5 行为邮政编码插入 a 和 b,因为它们具有相同的纬度和经度:

zipcode <- c("a","b","c","","")
lat <- c("1","2","3","1","2")
lon <- c("6","7","8","6","7")
data.frame(zipcode,lat,lon)
  zipcode lat lon
1       a   1   6
2       b   2   7
3       c   3   8
4           1   6
5           2   7

除非真的有必要,否则我宁愿不安装其他软件包。

谢谢

【问题讨论】:

  • 您确定丢失的邮政编码行中的纬度/经度总是会在其他行中找到吗?还是它们可能略有不同(相隔一段距离但仍在同一个邮政编码内)?如果是后者,可能计算未知纬度/经度和每个已知邮政编码一个纬度/经度之间的距离,但这是不完美的......使用一些在线查找 API 可能会更好。
  • 这是不是您只期望每个邮政编码有一组坐标,而您只需要填写它,就像这些是邮政编码区域的质心一样?如果没有,您如何尝试分配邮政编码?你会喜欢 (1, 7) 吗?

标签: r dataframe missing-data data-cleaning data-munging


【解决方案1】:

使用dplyr中的na_ifzipcode列中的空白值替换为NA,然后使用tidyr中的fill

library(dplyr)
library(tidyr)
df %>%
    group_by(lat, lon) %>% 
    mutate(zipcode = na_if(zipcode, "")) %>% 
    fill(zipcode)

#   zipcode lat   lon  
   #<fct>   <fct> <fct>
   #1 a       1     6    
   #2 b       2     7    
   #3 c       3     8    
   #4 a       1     6    
   #5 b       2     7 

【讨论】:

  • 我的数据集大约有 50,000 行和 110 列。这是否也会影响其他列?
  • @wickedpanda 不,其他列,如果 NA 将保持 NA。 mutate_all(na_if,"") 确实将所有 "" 替换为 NA,但仅填写了 zipcode
  • @wickedpanda 我已经进行了更新,只为 zipcode 列填写 NA。
  • 我试过这段代码。我收到此警告“mutate_all() 忽略了以下分组变量:列latitudelongitude 使用mutate_at(df, vars(-group_cols()), myoperation) 使消息静音。”
  • “除非真的有必要,否则我宁愿不安装其他软件包” 对我来说意味着仅在需要时才安装软件包。 library(tidyverse) 与此截然相反...我不知道有任何软件包或元软件包在安装时会导致安装更多软件包(尽管我确信那里有更大的软件包)。 (在我的系统上,这是超过 50 个新包。)也许您可以减少对library 的调用, 相关包?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
  • 2021-06-19
  • 2016-10-31
  • 1970-01-01
相关资源
最近更新 更多