Как определить подмножество строк, содержащих только «MISSING» и нули («0») в R - PullRequest
1 голос
/ 02 ноября 2019

Я создал набор данных, соединив несколько таблиц с основной таблицей, содержащей отдел_ид и год. В конечном кадре данных было много пропущенных значений, которые я затем вменял с помощью «MISSING» для категориальных и с «0» (ноль) для непрерывных переменных.

Теперь я хочу удалить подмножество строк, заполненных либо «MISSING», либо «0» (т.е. не имеющих других значений), как я могу сделать это в R?

Спасибо

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Я настоятельно рекомендую оставить ваши NA такими, какие они есть, если вы можете. R имеет встроенные универсальные функции для работы с NA в разных классах, которые могут значительно облегчить вашу жизнь. Если ваши пропуски обозначены разными значениями для каждого типа данных, вам нужно добавить сравнение для каждого типа пропущенных, что не очень эффективно.

Стоит также отметить, что параметрыниже можно обобщить, то есть они будут работать с фреймами данных с любым количеством столбцов, поэтому вам не нужно добавлять сравнение для каждого нового столбца.

Сначала сгенерируйте некоторые данные для тестирования:

df <- data.frame(num = c(1, 0, 3, 4, 0, 5),
                 cat = c("a", "b", "c", "d", "MISSING", "MISSING")
                 )

#### OUTPUT ####
  num     cat
1   1       a
2   0       b # <- keep
3   3       c
4   4       d
5   0 MISSING # <- drop
6   5 MISSING # <- keep

Вы можете фильтровать, используя базу R или dplyr (среди других опций):

# Base R option
df[rowSums(df == "MISSING" | df == 0) < ncol(df),]

# Tidyverse option using dplyr
library(dplyr)
filter_all(df, any_vars(!(. == "MISSING" | . == 0)))

Вывод для обеих опций будет выглядеть следующим образом:

  num     cat
1   1       a
2   0       b # <- kept
3   3       c
4   4       d
5   5 MISSING # <- kept

Просто ради аргумента, вот как вы можете упростить вещи, оставив NA s как есть. Сначала некоторые новые данные:

df_na <- data.frame(num = c(1, NA, 3, 4, NA, 5),
                    cat = c("a", "b", "c", "d", NA, NA)
                    )

#### OUTPUT ####
  num  cat
1   1    a
2  NA    b # <- keep
3   3    c
4   4    d
5  NA <NA> # <- drop
6   5 <NA> # <- keep

Теперь мы можем использовать те же стратегии, что и выше, но нам нужно только использовать is.na() вместо добавления сравнения для каждого типа пропущенных значений:

# Using base R
df_na[rowSums(is.na(df_na)) < ncol(df_na),]

# Using dplyr
library(dplyr)
filter_all(df_na, any_vars(!is.na(.)))

#### OUTPUT ####
  num  cat
1   1    a
2  NA    b # <- kept
3   3    c
4   4    d
6   5 <NA> # <- kept
0 голосов
/ 03 ноября 2019

Вы правы, что решение Отта не делает то, что говорят. Вот его решение, реализованное правильно, в базе R и в dplyr. Обратите внимание, что вам придется продублировать каждое предложение != 0 для каждого столбца.

# create some dummy data
data <- data.frame(
numeric = c(1, 2, 3, 0, 0, 0, 4, 5, 6),
categorical = c("MISSING", "A", "B", "MISSING", "C", "MISSING", "D", "MISSING", "E")
)

# base R solution
data[data$numeric != 0 | data$categorical != "MISSING", ]

# dplyr solution
filter(data, numeric != 0 | categorical != "MISSING")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...