Удаление строки, если количество NA больше 2 (или любого числа) в определенном количестве строк - PullRequest
0 голосов
/ 19 марта 2019

У меня есть следующий фрейм данных панели:

         X1     X2     X3     X4     X5    Y1     Y2     Y3     Y4     Y5
Ind 1    7      NA     NA     NA     NA     1      4      6      8      6 
Ind 2    2      NA     16     NA     NA     5     16     12      3      4
Ind 3    NA     NA      NA    19     92    13     NA     12     NA     NA
Ind 4    32     5       12    3       5    NA     NA     NA     NA      4
Ind 5    44      3      46    3      47     3      2     NA      3      4
Ind 6    NA     34      NA    8      NA    14     15     12      3      4
Ind 7    49     55      67    49     89     6     17      2      3      4
Ind 8    NA     NA      49    NA     NA    11     20      6      NA     4
Ind 9    1      1        5    NA     9     NA     NA     NA      NA     NA

В печатном формате:

df <- read.table(text="Index_name,X1 X2 X3 X4 X5 Y1 Y2     Y3     Y4     Y5
Ind_1    7      NA     NA     NA     NA     1      4      6      8      6 
Ind_2    2      NA     16     NA     NA     5     16     12      3      4
Ind_3    NA     NA      NA    19     92    13     NA     12     NA     NA
Ind_4    32     5       12    3       5    NA     NA     NA     NA      4
Ind_5    44      3      46    3      47     3      2     NA      3      4
Ind_6    NA     34      NA    8      NA    14     15     12      3      4
Ind_7    49     55      67    49     89     6     17      2      3      4
Ind_8    NA     NA      49    NA     NA    11     20      6      NA     4
Ind_9    1      1        5    NA     9     NA     NA     NA      NA     NA",row.names=1,
                 header=TRUE, stringsAsFactors=FALSE)

Я хочу отфильтровать все строки, которые не имеют по крайней мере 2 не NA значений в и столбцах, которые начинаются с X, и столбцах, которые начинаются с Y.

Например:

  • Ind1: Drop (только 1 значение в X1-X5)
  • Ind2: Сохранить (потому что здесь есть как минимум 2 числа в X)
  • Ind3: Сохранить, потому что X и Y имеют 2 или более наблюдений.
  • Ind4: Удалить (только 1 значение в Y1-Y5)
  • Ind5: Keep
  • Ind6: Keep
  • Ind7: Keep
  • Ind8: Удалить (только 1 значение в X1-X5)
  • Ind9: Удалить (хотя X в порядке, Y не в порядке.)

1 Ответ

0 голосов
/ 19 марта 2019

Вы могли бы сделать это.По сути, вы рассчитываете (с rowSums) количество точек данных, не относящихся к NA, сначала в x1-x5, а затем в y1-y5.Для идентификации не-NA я использую !is.na().! является отрицанием, поэтому выражение означает «Не АН».Наконец, вы сохраняете только те строки, в которых «сумма строк не-NA равна> = 2» для x1-x5 AND (&) для y1-y5.Для ясности в индексировании в вашем data.frame есть 10 столбцов.df[,1:5] представляет первые 5 столбцов, которые являются x1-x5.

df[rowSums(!is.na(df[,1:5]))>=2 & rowSums(!is.na(df[,6:10]))>=2,]

      X1 X2 X3 X4 X5 Y1 Y2 Y3 Y4 Y5
Ind_2  2 NA 16 NA NA  5 16 12  3  4
Ind_3 NA NA NA 19 92 13 NA 12 NA NA
Ind_5 44  3 46  3 47  3  2 NA  3  4
Ind_6 NA 34 NA  8 NA 14 15 12  3  4
Ind_7 49 55 67 49 89  6 17  2  3  4

DATA

df <- read.table(text="Index_name,X1 X2 X3 X4 X5 Y1 Y2     Y3     Y4     Y5
Ind_1    7      NA     NA     NA     NA     1      4      6      8      6 
Ind_2    2      NA     16     NA     NA     5     16     12      3      4
Ind_3    NA     NA      NA    19     92    13     NA     12     NA     NA
Ind_4    32     5       12    3       5    NA     NA     NA     NA      4
Ind_5    44      3      46    3      47     3      2     NA      3      4
Ind_6    NA     34      NA    8      NA    14     15     12      3      4
Ind_7    49     55      67    49     89     6     17      2      3      4
Ind_8    NA     NA      49    NA     NA    11     20      6      NA     4
Ind_9    1      1        5    NA     9     NA     NA     NA      NA     NA",row.names=1,
                 header=TRUE, stringsAsFactors=FALSE)
...