【问题标题】:Conditionally removing duplicates in R (20K observations)有条件地删除 R 中的重复项(20K 观察)
【发布时间】:2017-10-23 17:47:31
【问题描述】:

我目前正在研究一个大型数据集,研究重复的水权。每个权利持有人都被分配了一个 RightID,但有些权利被记录了两次以用于文书目的。但是,一些 rightID 不止一次列出,并且确实与我的最终目标相关。一个例子:当金属标签号码被分配给特定的水权时,会出现重复条目​​。为避免重复计算关键信息,我需要删除一个观察结果。

我现在已经写好了,

#Updated Metal Tag Number
for(i in 1:nrow(duplicate.rights)) {
  if( [i, "RightID"]==[i-1, "RightID"] & [i,"MetalTagNu"]=![i-1, "MetalTagNu"] ){
    remove(i)
  }
  print[i]
}

原来的数据框也是这样设置的:

RightID    Source        Use           MetalTagNu
1-0000     Wolf Creek    Irrigation    N/A
1-0000     Wolf Creek    Irrigation    12345
1-0001     Bear River    Domestic      N/A
1-0002     Beaver Stream Domestic      00001
1-0002     Beaver Stream Irrigation    00001

例如权利人 1-0002 必须保留,因为他将其水权用于两个不同的目的。但是,权利人1-0000 是不需要重复的。

权利持有人 1-0000 我需要消除,但权利持有人 1-0002 对我的最终目标很有价值。我还应该注意,单个 rightID 最多可以有 10 个条目,但在这 10 个条目中,只有 1 个是不必要的重复项。此外,数据集中的重复条目和原始条目不会彼此相邻。

我是新手,所以请原谅我之前糟糕的尝试。我知道我可以使用 lapply 函数来让它更快更高效。任何指导将不胜感激。

【问题讨论】:

标签: r for-loop if-statement duplicates lapply


【解决方案1】:

所以我建议如下:

1)你说你想保留一些重复(金属标签号码被分配给特定的水权)。我不知道这是什么意思。但我假设它是这样的——如果金属标签编号 = 1,那么即使有重复,你也想保留它们。所以我建议你把数据中的这些行(我们称之为data)取出:

data_to_keep <- data[data$metal_tag_number == 1, ]
data_to_dedupe <- data[data$metal_tag_number != 1, ]    

2) 现在你有了两个数据帧,你可以毫无问题地对数据帧data_to_dedupe 进行重复数据删除:

deduped_data = data_to_dedupe[!duplicated(data_to_dedupe$dedupe_key), ]

3) 现在您可以将两个数据框重新合并在一起:

final_data <- rbind(data_to_keep, deduped_data)

如果这是您想要的,请加分并建议答案是正确的。谢谢!

【讨论】:

    【解决方案2】:

    创建一个新的列,key,它是 RightID 和 Use 的组合。

    假设你的数据框被称为 df,

    df$key

    然后,使用此命令删除重复项:

    df1

    df1 将没有重复项。

    【讨论】:

      猜你喜欢
      • 2020-05-22
      • 2012-06-05
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      相关资源
      最近更新 更多