Определите дублированные строки на основе нескольких столбцов и конкретного значения в другом столбце в очень большой матрице с циклом for - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть большая матрица с именем data из 10 864 строк и 134 столбцов.

Первые 4 столбца являются параметрами, которые делают каждую строку уникальной.Данные от 5-го до 134-го столбца для всех строк - это числа от 1 до 20.

enter image description here

enter image description here

Я запускаю цикл for в матрице, чтобы вставить NA в определенные ячейки матрицы.Это необходимо сделать на основе уникальных значений из столбцов OrgID, rank и scorei, только если значение в той же строке для столбца score(i+12) != 1.

Следовательно, я запускаю for loop из столбца 5 в 134, и там, где есть дублирование на основе этих трех столбцов, а значение в 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"
} 

Этот код, однако, дает неправильный вывод, вставляя NA только в том случае, если имеется дублированное значение на основе 1 st, 4 th и ith столбец, т. е. эквивалентный результат выполнения следующего кода:

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

Как заставить его выполнить требуемую операцию только при значении в столбце score(i+12) !=1 в дублированных строках.

Чтобы упростить просмотр неудачного вывода, я выделил несколько строк и соответствующие столбцы, чтобы показать, как это работает при применении к столбцу 118, т. Е. i =118 здесь.

enter image description here

Например, на основе объясненной выше логики, в OrgID=5659 есть дублирование.Дублирование на основе OrgID, ранга и показателя118 идентифицирует эти 2 строки, причем одна строка показывает значение в score130=1, а другая score130=16.Следовательно, в строке с score130=16 должно быть теперь NA в соответствии с логикой.Но это остается неизменным на 16.

1 Ответ

1 голос
/ 23 сентября 2019

Может быть, вы можете попробовать

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
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...