簡體   English   中英

有條件地刪除R中的重復項(20,000個觀察值)

[英]Conditionally removing duplicates in R (20K observations)

我目前正在處理大量的水權,研究重復的水權。 每個權利持有者都分配有一個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個是不必要的重復。 同樣,重復項和原始項在數據集中不會相鄰。

我是新手,所以請原諒我以前的可憐嘗試。 我知道我可以使用l apply函數使此過程更快,更有效。 任何指導將不勝感激。

因此,我建議以下幾點:

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對數據幀data_to_dedupe進行重復數據刪除了:

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

3)現在您可以將兩個數據框合並回去:

final_data <- rbind(data_to_keep, deduped_data)

如果這是您想要的,請加注並建議答案正確。 謝謝!

創建一個新的列,鍵,它是RightID和Use的組合。

假設您的數據框稱為df,

df $ key <-paste(df $ RightID,df $ Use)

然后,使用以下命令刪除重復項:

df1 <-df [!duplicated(df [,1],)]

df1將沒有重復項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM