如果在一定数量的行中NA的数目大于2(或任何数目),则删除行

时间:2019-03-19 11:57:03

标签: r dataframe subset

我有以下面板数据框:

         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)

我想过滤出都是NA开头的列和以<{1}开始的列中所有没有至少两个非X值的行与Y

例如:

  • Ind1:删除(X1-X5中只有1个值)
  • Ind2:保留(因为X中至少有2个数字)
  • Ind3:保持不变,因为X和Y都有2个或更多观测值。
  • Ind4:删除(Y1-Y5中只有1个值)
  • ind5:保留
  • Ind6:保留
  • ind7:保留
  • Ind8:删除(X1-X5中只有1个值)
  • Ind9:删除(尽管X没问题,Y没问题。)

1 个答案:

答案 0 :(得分:0)

您可以这样做。基本上,您正在计数(使用rowSums),首先在x1-x5中然后在y1-y5中计算非NA数据点的数量。要识别非NA,我使用!is.na()!是一个否定词,因此该表达式的意思是“不是NA”。最后,对于x1-x5,仅保留“非NA的行总和> = 2”的行;对于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

数据

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)