У меня есть кадр данных, похожий на следующий пример. Иногда строки содержат ту же информацию об объекте, что и в другой строке, за исключением одного (или нескольких) столбцов, которые содержат «NA». Мне нужны только строки с максимально возможной информацией, поэтому я хочу удалить все строки, которые содержат «NA», но в остальном имеют ту же информацию, что и другая строка. «NA» может быть в столбце C или D или в обоих (никогда не в A или B). Если нет «более точной» строки, строка, содержащая «NA», должна остаться.
Я пробовал это использовать цикл for (см. Пример), и он работает, строки 1 и 6 будут удалены. Однако мне пришлось бы настроить его так, чтобы он также проверял столбец C, и в моих реальных данных у меня есть еще несколько столбцов и, следовательно, несколько возможных комбинаций, что делает это решение непрактичным и может привести к ошибкам.
Есть ли другой способ легко решить эту проблему?
Спасибо!
df <- rbind(data.frame(A = "obj1", B = "1", C = "2", D = "NA"),
data.frame(A = "obj1", B = "1", C = "2", D = "3"),
data.frame(A = "obj2", B = "1", C = "NA", D = "3"),
data.frame(A = "obj2", B = "1", C = "2", D = "3"),
data.frame(A = "obj2", B = "3", C = "2", D = "3"),
data.frame(A = "obj2", B = "3", C = "2", D = "NA"),
data.frame(A = "obj3", B = "2", C = "4", D = "6"),
data.frame(A = "obj4", B = "2", C = "NA", D = "NA"))
toBeDeleted <- c(55)
for (i in 1:nrow(df)){
thisRow <- df[i,]
if (thisRow$D == "NA"){
for (j in i:nrow(subset(df, A == thisRow$A))){
anotherRow <- df[j,]
if (anotherRow$A == thisRow$A & anotherRow$B == thisRow$B
& anotherRow$C == thisRow$C & anotherRow$D != thisRow$D){
toBeDeleted <- c(toBeDeleted,i)
}
}
}
}
df2 <- df[-toBeDeleted,]