删除R中包含一个空白列的行

时间:2016-09-14 13:01:07

标签: r dataframe null conditional-statements

我的数据集如下:

  ID               EMAIL_ID.x        ID.y     EMAIL_ID.y
 60842               k@aol.com      60842        k@aol.com
 90853                a.b.c         NA            <NA>
 90854                b.c.d         NA            <NA>
 83907               h@gwi.net      02854         <NA>
 83908             s@hotmail.com    00952         <NA>
 83909             l@rediff.com     78895         <NA>

在这些数据中,我只想保留第3列和第4列都已填充或两者都未填充的行。

因此结果应该是:

   ID               EMAIL_ID.x       ID.y     EMAIL_ID.y
 60842               k@aol.com      60842        k@aol.com
 90853                a.b.c         NA            <NA>
 90854                b.c.d         NA            <NA>

在上文中,第3列具有值但第4列没有的行已被删除。

请建议如何在R中完成。

三江源!

1 个答案:

答案 0 :(得分:1)

一个选项是检查两个(is.na(...))列中的NA元素(&)或(|)两个非NA元素(通过否定{{1} })并使用该逻辑索引对行进行子集化。

!

或另一种选择是在逻辑矩阵(df1[is.na(df1[,3]) & is.na(df1[,4]) | !is.na(df1[,3]) & !is.na(df1[,4]),] # ID EMAIL_ID.x JPNUMBER.y EMAIL_ID.y #1 60842 k@aol.com 60842 k@aol.com #2 90853 a.b.c NA <NA> #3 90854 b.c.d NA <NA> )上应用rowSums,使用is.na(df1[3:4])检查NA元素的总和是0还是2(如果它是0 - 它表示没有NA元素,2表示两列都有NA)并使用逻辑向量对行进行子集化。

%in%

或另一个选项是df1[rowSums(is.na(df1[3:4])) %in% c(0,2),] # ID EMAIL_ID.x JPNUMBER.y EMAIL_ID.y #1 60842 k@aol.com 60842 k@aol.com #2 90853 a.b.c NA <NA> #3 90854 b.c.d NA <NA> Reduce(以避免转换为矩阵 - 如果数据集非常大)

lapply

注意:如果OP数据集中的NA不是真正的NA,我们需要在执行此操作之前将其转换为实际NA(假设第4列为df1[Reduce(`+`, lapply(df1[3:4], is.na)) != 1,] 类)

character

数据

is.na(df1[,4]) <- df1[,4] == "<NA>"