簡體   English   中英

使用 for 循環在非常大的矩陣中根據多列和另一列中的特定值識別重復行

[英]Identify duplicated rows based on multiple columns and specific value in another column in very large matrix with for loop

我有一個大矩陣,稱為 10,864 行和 134 列的data

前 4 列是使每一行唯一的參數。 所有行的第 5 列到第 134 列的數據是 1 到 20 之間的數字。

在此處輸入圖像描述

在此處輸入圖像描述

我在矩陣中運行一個 for 循環以將NA插入矩陣的某些單元格中。 這需要基於來自 Columns OrgIDrankscorei的唯一值來完成,前提是列score(i+12) != 1的同一行中的值。

因此,我從第 5 列到第 134 列運行一個for loop ,並且基於這三列存在重復並且score(i+12)列值中的值不等於 1,我將NA插入到矩陣的該單元格中。

for(i in 5:ncol(data){
data[which(duplicated(data[,c(1,4,i)]) & (data[,i+12])!=1),i] <- "NA"
} 

但是,此代碼給出了錯誤的 output,方法是僅在基於第1 、第4和第i列存在重復值的地方插入NA ,即與運行以下代碼等效的結果:

for(i in 5:ncol(data){
    data[which(duplicated(data[,c(1,4,i)])),i] <- "NA"
    }   

僅當重復行中列score(i+12) !=1中的值時,如何使其執行所需的操作。

為了更簡單地查看失敗的 output,我突出顯示了幾行和相關列,以顯示當應用於列 118 時它是如何工作的,即此處i =118

在此處輸入圖像描述

例如,根據上面解釋的邏輯, OrgID=5659中存在重復。 基於 OrgID、rank 和 score118 的重復標識了這 2 行,其中一行顯示score130=1和其他score130=16中的值。 因此,根據邏輯,在score130=16的行中現在應該是NA 但這在16時保持不變。

也許你可以試試

for(i in 5:(ncol(data) - 12)) {
   inds <- duplicated(data[c(1,4,i)]) | duplicated(data[c(1,4,i)], fromLast = TRUE)
   data[inds & data[[i + 12]] != 1, i + 12] <- NA
} 

暫無
暫無

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

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