【问题标题】:copying rows based on column values根据列值复制行
【发布时间】:2016-11-22 06:49:42
【问题描述】:

我被难住了。如何根据行是否匹配将数据复制到 ID 变量中的另一行。我正在处理数千个历史地址,但并非所有地址都完全匹配。但是任何差异通常都在地址的末尾,因此使用该值的前 4 或 5 个字符应该可以处理它。我想用适当的区域代码填写 NA。我一直在尝试 dplyr 解决方案,却一无所获。任何想法将不胜感激。

ID<-c(50,50,50,71,71,71)
ID_Y<-c(505,506,507,715,716,717)
address<-c("325 Park St N","325 Park St","325 Park","616 Holly","616 Holly Dr","510 Walnut Dr")
tract<-c(110,NA,NA,223,NA,989)

AD567<-data.frame(ID,ID_Y,address,tract)
AD567
  ID ID_Y       address tract
1 50  505 325 Park St N   110
2 50  506   325 Park St   NA
3 50  507      325 Park   NA
4 71  715     616 Holly   223
5 71  716  616 Holly Dr   NA
6 71  717 510 Walnut Dr   989

试图到达这里:

  ID ID_Y       address tract
1 50  505 325 Park St N   110
2 50  506   325 Park St   110
3 50  507      325 Park   110
4 71  715     616 Holly   223
5 71  716  616 Holly Dr   223
6 71  717 510 Walnut Dr   989

【问题讨论】:

  • 试试na.locf(df)。它在动物园图书馆。
  • 为什么要将混合类型存储在矩阵中?为什么不是数据框?无论哪种方式,您似乎都需要某种类型的模糊连接,谷歌一下。
  • 我会选择上面的@David。根据地址对数据框进行排序并使用na.locf()。试试看。
  • 如果前 5 个字符是不同的(一旦数据变大就值得怀疑),library(tidyverse) ; AD567 %&gt;% group_by(addr5 = substr(address, 1, 5)) %&gt;% fill(tract) %&gt;% fill(tract, .direction = 'up'),但如果始终填写第一个值,您真的可以只使用 AD567 %&gt;% fill(tract) .
  • @alistaire 谢谢你,这在 2500 个案例中除了一个案例之外都成功了

标签: r dplyr plyr


【解决方案1】:

这是一个没有任何额外库的解决方案

# introduce an additional column which serves as heuristic key
AD567$prefix = substr(AD567$address, 1, 8)

# extract all records which have a tract code
TRACT = AD567[! is.na(AD567$tract),c("prefix", "tract")]
# check if the record is unique per prefix
aggregate(tract ~ prefix, TRACT, length)
# ... one may use only those records further on which are unique ...

# merge both data frames to inject the tract code; make sure nothing
# is lost from AD567
AD567 = merge(AD567, TRACT, by="prefix", suffixes = c("", ".ref"), all.x = TRUE)

# copy over tract code
AD567$tract = AD567$tract.ref

# remove utility columns
AD567 = AD567[, ! colnames(AD567) %in% c("prefix", "tract.ref")]

请记住,这是一种非常糟糕的启发式方法。不精确或模糊的数据匹配本身就是一门科学。

【讨论】:

    猜你喜欢
    • 2018-12-09
    • 2021-11-20
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    相关资源
    最近更新 更多