R фильтрация данных - PullRequest
       6

R фильтрация данных

2 голосов
/ 07 апреля 2011

У меня есть датафрейм df следующим образом:

 A  B  C
 NA 1  2
 2  NA 3
 4   5 6
 7   8 9

я хочу удалить все строки, которые имеют NA.

если я использую

 apply(df,1,function(row) all(!is.na(row)))

Я получаю список всех строк с TRUE (если строка не содержит NA) и FALSE (если строка содержит NA). Но как мне получить имя строки, чтобы я мог создать что-то вроде

df2<-df[-c(list of rows that contains NA),] 

, который даст мне весь новый фрейм данных с NA в строках.

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 07 апреля 2011

Предполагается, что у вас есть кадр данных, который выглядит следующим образом:

   A  B C
1 NA  1 2
2  2 NA 3
3  4  5 6
4  7  8 9

Тогда попробуйте:

df1[apply(df1,1,function(x) !any(is.na(x))), ]
  A B C
3 4 5 6
4 7 8 9

Он не использует имена строк, а скорее логический вектор. Наверное, мы с Джошуа читали ваш вопрос по-разному, но мы использовали один и тот же метод.

Предложение Джошуа более компактно:

> na.omit(df1)
  A B C
3 4 5 6
4 7 8 9

И это напоминает мне, что я должен был использовать:

> df1[complete.cases(df1), ]
  A B C
3 4 5 6
4 7 8 9
1 голос
/ 07 апреля 2011

Вы можете использовать логический вектор из вашего apply вызова для индексации вашего data.frame.

> Data[!apply(Data,1,function(row) all(!is.na(row))),]
   A  B C
1 NA  1 2
2  2 NA 3
> # or like this:
> Data[apply(Data,1,function(row) any(is.na(row))),]
   A  B C
1 NA  1 2
2  2 NA 3
0 голосов
/ 08 апреля 2011

is.na для data.frame возвращает matrix, что является лучшим кандидатом для применения:

df <- read.table(textConnection(" A  B  C
NA 1  2
2  NA 3
4   5 6
7   8 9
"))

## a matrix
is.na(df)

## logical for selecting rows that are all NA
apply(df, 1, function(x) all(is.na(x)))

##  one liner
df[!apply(df, 1, function(x) all(is.na(x))), ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...