有条件地删除R中的重复项(20K观测值)

时间:2017-05-23 16:36:28

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

我目前正在研究一个关注重复水权的大型数据集。每个权利持有人都被分配了一个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

E.g。权利人1-0002是必须保留的,因为他正在使用他的水权用于两个不同的目的。但是,权利持有人1-0000是不必要的重复。

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

我是新手所以请原谅我之前的不良尝试。我知道我可以使用l apply函数来提高速度和效率。任何指导都会非常感激。

2 个答案:

答案 0 :(得分:0)

所以我建议如下:

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)

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

答案 1 :(得分:0)

创建一个新列,key,它是RightID和amp;的组合。使用

假设您的数据框名为df,

df $ key&lt; - paste(df $ RightID,df $ Use)

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

df1&lt; - df [!duplicated(df [,1],)]

df1没有重复项。