Я пытаюсь удалить строки в df, когда NA появляется в двух определенных столбцах.
Пример кадра данных
tmp <- data.frame(state = c(1, 1, 2, 2, 3, 3, 4, 5),
reg = c(NA, 3, 6, NA, 9, 1, NA, 7),
gas = c(NA, 5, NA, 9, 1, 3, NA, 1),
other = c(1, 2, 4, 2, 6, 8, 1, 1) )
из таблицы видно, что есть две строки, в которых и "рег", и "газ" - нет данных.
table(tmp$reg, tmp$gas, useNA = 'always')
1 3 5 9 <NA>
1 0 1 0 0 0
3 0 0 1 0 0
6 0 0 0 0 1
7 1 0 0 0 0
9 1 0 0 0 0
<NA> 0 0 0 1 2
Я хотел бы удалить эти строки, но сохранить другие значения NA.
Я пробовал этот код:
tmp[!is.na(tmp$reg & tmp$gas), ]
но удаляет все строчки с NA в reg и gas
state reg gas other
2 1 3 5 2
5 3 9 1 6
6 3 1 3 8
8 5 7 1 1
Это результат, который я ищу:
state reg gas other
2 1 3 5 2
3 2 6 NA 4
4 2 NA 9 2
5 3 9 1 6
6 3 1 3 8
8 5 7 1 1
я тоже пробовал
tmp[which(!is.na(tmp$reg & tmp$gas)), ]
но это приводит к тому же нежелательному результату.
обе эти команды tmp[which(!is.na(tmp$gas) & !is.na(tmp$reg)),]
tmp[(!is.na(tmp$gas) & !is.na(tmp$reg)),]
дают тот же нежелательный результат, что и выше
Я не знаю, почему первоначальный подход не сработал, но я предполагаю, что в цепочке есть какая-то ошибка, которую я не вижу. Противоположный подход (удаление тех, которые удовлетворяют условию), по-видимому, дает желаемый результат.
tmp <- data.frame(state = c(1, 1, 2, 2, 3, 3, 4, 5),
reg = c(NA, 3, 6, NA, 9, 1, NA, 7),
gas = c(NA, 5, NA, 9, 1, 3, NA, 1),
other = c(1, 2, 4, 2, 6, 8, 1, 1) )
res = tmp[-which(is.na(tmp$reg) & is.na(tmp$gas)),]
res
#> state reg gas other
#> 2 1 3 5 2
#> 3 2 6 NA 4
#> 4 2 NA 9 2
#> 5 3 9 1 6
#> 6 3 1 3 8
#> 8 5 7 1 1
Created on 2020-12-24 by the reprex package (v0.3.0)
это ошибка, о которой нужно сообщить, или это так задумано?
Вместо этого вы должны рассматривать их как отдельные условия с оператором
AND
, например.(!is.na(tmp$gas) & !is.na(tmp$reg))
. Это работает для вас?