我想根据每行中NA的数量过滤data.frame
。根据行向NA计数过滤数据帧
如果我开始与以下,
> d
A B C E
1 2 2 6 7
2 4 9 NA 10
3 6 NA NA 4
4 9 7 1 8
我想过滤d
列有2或更多NA的除去行A,B和C,以产生:
A B C E
1 2 2 6 7
2 4 9 NA 10
4 9 7 1 8
我想根据每行中NA的数量过滤data.frame
。根据行向NA计数过滤数据帧
如果我开始与以下,
> d
A B C E
1 2 2 6 7
2 4 9 NA 10
3 6 NA NA 4
4 9 7 1 8
我想过滤d
列有2或更多NA的除去行A,B和C,以产生:
A B C E
1 2 2 6 7
2 4 9 NA 10
4 9 7 1 8
为了可再现性,请在下面定义data.frame
,并在每行中定义各种数量的NA
。
df <- data.frame(
A = c(1, 2, 3, NA),
B = c(1, 2, NA, NA),
C = c(1, NA, NA, NA),
E = c(5, 6, 7, 8)
)
定义计数在给定行,如果NA
的数的函数:
countNA <- function(df) apply(df, MARGIN = 1, FUN = function(x) length(x[is.na(x)]))
基于问题的措辞,从这个计算中排除列E
:
df_noE <- subset(df, select=-E)
现在使用上面的函数计算每行NA
s:
na_count <- countNA(df_noE)
现在过滤原始data.frame
这个数:
df[na_count < 2,]
在单行一起:
df[countNA(subset(df, select=-E)) < 2,]
我们可以对数据集中的列子集使用rowSums
与is.na
子集行
d[rowSums(is.na(d[1:3]))<2,]
# A B C E
#1 2 2 6 7
#2 4 9 NA 10
#4 9 7 1 8
d[1:3]
仅选择'A,B,C'列的数据集。应用is.na
将其转换为TRUE/FALSE
的逻辑矩阵,在rowSums
的每一行中执行TRUE值的sum
,最后检查该数字是否小于2以获得我们用于子集化行的逻辑vector
。
另一种方法是使用Reduce
与+
d[Reduce(`+`,lapply(d[1:3], is.na)) <2,]
这是一个更好的答案 –
谢谢Saladi!为了澄清,如果我想扩展到在我的数据框列表中的每个数据框上执行,我会用我的df [i]替换df吗? –
如果'df'实际上是一个数据框的列表,我想你会想'df [[i]]' –
非常感谢@saladi - 我在这里发布了我的新问题http://stackoverflow.com/问题/ 35835597/in-r-use-a-function-apply-lapply-that-is-working-over-a-list-of-dat –