【问题标题】:Conditional delete rows: delete the quasi-identical rows but not the identical条件删除行:删除准相同但不相同的行
【发布时间】:2017-02-15 23:12:18
【问题描述】:

我有一个数据框,我需要根据行中“准相同”的两个值对其进行净化。我只需要删除不同但不相同的观察结果。我尝试使用agrep 执行此操作,但此功能也会删除相同的观察结果。

Id<-c("RoLu1976","Rolu1976","RoLu1976","AlBl1989","ThSa1996")
Art<-c("Econometric Policy Evaluation: A Critique","Econometric Policy Evaluations A Critique","Econometric Policy Evaluation: A Critique", "Rules after discretion", "Expectations and the Nonneutrality of Lucas")
Id.1<-c("FiKy1989","FiKy1989","BeBe1983","JoSt1989","JoSt1990")
Art.1<-c("Notes on the Lucas Critique","Notes on the Lucas Critique","The Inconsistency of Optimal Plans","The Inconsistency","Notes on the Lucas")
N<-data.frame(Id,Art,Id.1,Art.1)

上述dataframe 中的准相同值在两个第一个观察值的Art 列中,仅s 和: 不同。

在上述情况下,最终的数据框应该是(注意相同的值没有被删除):

Id        Art                                          Id.1       Art.1
RoLu1976  Econometric Policy Evaluation: A Critique    FiKy1989   Notes on the Lucas Critique
RoLu1976  Econometric Policy Evaluation: A Critique    BeBe1983   The Inconsistency of Optimal Plans
AlBl1989  Rules after discretion                       JoSt1989   The Inconsistency
ThSa1996  Expectations and the Nonneutrality of Lucas  JoSt1990   Notes on the Lucas

我做的是this:

yy = NULL
for(i in 1:length(N$Art)){
  temp = agrep(N[i,"Art"],N$Art,value=T)
  y = ifelse(any(N[i,"Art"]==temp),temp[1],N[i,"Art"])
  yy = c(yy,y)
}
N$Art = yy
N.2 = N[!duplicated(N$Art), ]

但它会删除两个值:相同和准相同。

我该怎么做?

【问题讨论】:

  • 您确定您的标准仅基于“艺术”列吗?假设您的原始N 的第二行有“Art.1”,例如“Foobar”(即不同于其他“重复项”的“Art.1”)。那你还想放弃吗?
  • @mathematical.coffee 这将是两个标准:“Art”列在“Art.1”(或任何其他列)中准相同但相同,并删除“Art”中的所有准相同值"(不相同)但在“Art1”中相同。

标签: r dataframe string-matching delete-row


【解决方案1】:

您可以将相同事物的索引存储在原始Art列中,并将其与去重后的结果结合使用,例如

originallyDuplicated <- duplicated(N$Art)
# then run your snippet to generate `yy`

所以你想摆脱重复的东西现在,但不是原来。

N[!(duplicated(yy) & !originallyDuplicated),]

尽管在我看来,与其将排除标准完全基于 Art 列,不如排除一行中的 每一列 重复(或几乎重复)表中的其他地方。 (例如,在 Art.1、Id.1、ID 等列上也进行比较?)

【讨论】:

  • 如果您在N 中有多个相同的错字,这可能会搞砸(例如,假设您有两个“计量经济政策评估”) - 因为您 (R) 将如何知道哪一个是“重复”,哪个是“原始”?
  • 两者都可以作为“原始”,但问题是——虽然两者“不同”——其他列中的值是相同的,这意味着该值被计算了两次。
  • @mathematical.cofee 你说得对,当数据框有几个“准相同”的值时,它只会删除其中一个准相同的值,而其他值只会更改为原始形式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
相关资源
最近更新 更多