繁体   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