我的数据集如下:
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中完成。
三江源!
答案 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>"