Я хотел бы удалить строки в этом фрейме данных, которые:
а) содержать NA
s во всех столбцах. Ниже мой пример фрейма данных.
gene hsap mmul mmus rnor cfam
1 ENSG00000208234 0 NA NA NA NA
2 ENSG00000199674 0 2 2 2 2
3 ENSG00000221622 0 NA NA NA NA
4 ENSG00000207604 0 NA NA 1 2
5 ENSG00000207431 0 NA NA NA NA
6 ENSG00000221312 0 1 2 3 2
В основном, я хотел бы получить фрейм данных, такой как следующий.
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
6 ENSG00000221312 0 1 2 3 2
б) содержать NA
s только в некоторых столбцах , поэтому я также могу получить этот результат:
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
4 ENSG00000207604 0 NA NA 1 2
6 ENSG00000221312 0 1 2 3 2
final[complete.cases(final),]
?complete.cases
? Если бы я хотел сохранить ряды с NA, а не отбрасывать?final[ ! complete.cases(final),]
не сотрудничает ...final
переменная датафрейма?Попробуй
na.omit(your.data.frame)
. Что касается второго вопроса, попробуйте опубликовать его как другой вопрос (для ясности).источник
rownames(x) <- NULL
.na.omit()
отбрасывает строки, которые содержатсяNA
в любом столбцеtidyr
имеет новую функциюdrop_na
:источник
drop_na
. Так , например,df %>% drop_na()
,df %>% na.omit()
иdrop_na(df)
все в основном эквивалентны.na.omit
добавляет дополнительную информацию, такую как индексы пропущенных регистров, и, что более важно, не позволяет выбирать столбцы - это то, гдеdrop_na
светит.na.omit
с или без труб, так же, как вы можете использоватьdrop_na
с или без труб.Я предпочитаю следующий способ проверить, содержат ли строки какие-либо NA:
Это возвращает логический вектор со значениями, обозначающими, есть ли какой-либо NA в строке. Вы можете использовать его, чтобы увидеть, сколько строк вам нужно отбросить:
и в конце концов уронить их
Для фильтрации строк с определенной частью NA становится немного сложнее (например, вы можете указать 'final [, 5: 6]' для 'apply'). В общем, решение Joris Meys кажется более элегантным.
источник
rowSum(!is.na(final))
кажется лучше подходит чемapply()
Другой вариант, если вы хотите лучше контролировать, как строки считаются недействительными, это
Используя вышеизложенное, это:
становится:
... где удаляется только строка 5, поскольку это единственная строка, содержащая NA для обоих
rnor
ANDcfam
. Затем логическая логика может быть изменена в соответствии с конкретными требованиями.источник
Если вы хотите контролировать, сколько NA допустимо для каждой строки, попробуйте эту функцию. Для многих наборов данных опроса слишком много пустых ответов на вопросы могут испортить результаты. Поэтому они удаляются после определенного порога. Эта функция позволит вам выбрать, сколько NA может иметь строка, прежде чем она будет удалена:
По умолчанию он удалит все NA:
Или укажите максимально допустимое количество NA:
источник
Если производительность является приоритетом, используйте
data.table
иna.omit()
с необязательным параметромcols=
.na.omit.data.table
является самым быстрым в моем тесте (см. ниже), будь то для всех столбцов или для выбранных столбцов (вопрос OP часть 2).Если вы не хотите использовать
data.table
, используйтеcomplete.cases()
.На ванили
data.frame
,complete.cases
быстрее чемna.omit()
илиdplyr::drop_na()
. Обратите внимание, чтоna.omit.data.frame
не поддерживаетcols=
.Результат теста
Ниже приведено сравнение базовых (синих),
dplyr
(розовых) иdata.table
(желтых) методов для отбрасывания всех или выборки пропущенных наблюдений с условным набором данных из 1 миллиона наблюдений 20 числовых переменных с независимой 5% вероятностью пропуска и подмножество 4 переменных для части 2.Ваши результаты могут отличаться в зависимости от длины, ширины и разреженности вашего конкретного набора данных.
Отметьте масштаб журнала на оси Y.
Контрольный скрипт
источник
Используя пакет dplyr, мы можем отфильтровать NA следующим образом:
источник
drop_na()
Это вернет строки, которые имеют по крайней мере ОДНО значение, отличное от NA
Это вернет строки, которые имеют по крайней мере ДВА значения, отличного от NA.
источник
На ваш первый вопрос у меня есть код, с которым мне удобно избавиться от всех НС. Спасибо за @Gregor, чтобы сделать это проще.
По второму вопросу код - это просто альтернатива предыдущему решению.
Обратите внимание, что -5 - это количество столбцов в ваших данных. Это исключит строки со всеми NA, так как rowSums добавляет до 5, и они становятся нулями после вычитания. На этот раз, как логично, необходимо.
источник
Мы также можем использовать функцию подмножества для этого.
Это даст только те строки, которые не имеют NA как в mmul, так и в rnor
источник
Я синтезатор :). Здесь я объединил ответы в одну функцию:
источник
Предполагая, что в
dat
качестве вашего кадра данных, ожидаемый результат может быть достигнут с помощью1.
rowSums
2.
lapply
источник
Один из подходов, это как общие , так и дает достаточно читаемый код, чтобы использовать
filter
функцию и ее варианты в пакете dplyr (filter_all
,filter_at
,filter_if
):источник
Выше функция удаляет все строки из фрейма данных, который имеет «NA» в любом столбце и возвращает результирующие данные. Если вы хотите проверить наличие нескольких значений, таких как
NA
и?
изменитьdart=c('NA')
в параметре функции наdart=c('NA', '?')
источник
Я думаю, что это может быть более элегантно решено следующим образом:
источник
NA
. Я думаю, что ОП хочет:df %>% filter_all(all_vars(!is.na(.)))