4

我有一个包含多行和多列的数据框。

我有一个字符向量,其中包含数据框中某些列的名称。列数可以变化。

对于每一行,对于这些列中的每一列,我必须确定其中一个是否不是 NA。(基本上any(!is.na(df[namecolumns]))对于每一行),然后为TRUE.

实际上,any(!is.na(df[1,][namescolumns]))效果很好,但仅适用于第一行。

我可以轻松地做一个 for 循环,这是我作为程序员的第一个反应,因为它适用于第一行,但我确信这不是R方法,并且有一种方法可以使用"apply"( lapply, mapply,sapplytapply其他),但我不知道是哪一个以及如何。

谢谢你。

4

2 回答 2

2

尝试apply在第一个维度(行)上使用:

apply(df, 1 function(x) any(!is.na(x[namescolumns])))

结果将转置返回,因此,您可能希望将整个语句包装在t(.)

于 2013-03-12T18:15:19.987 回答
0

您可以使用lapply和的组合Reduce

has.na.in.cols <- Reduce(`&`, lapply(colnames, function (name) !is.na(df[name])))

NA获取中的任何列中是否存在值的向量,该向量colnames又可用于对数据进行子集化。

df[has.any.na,]

例如。鉴于:

df <- data.frame(a = c(1,2,3,4,NA,6,7),
                 b = c(2,4,6,8,10,12,14),
                 c = c("one","two","three","four","five","six","seven"),
                 d = c("a",NA,"c","d","e","f","g")
                 )
colnames <- c("a","d")

你可以得到:

> df[Reduce(`&`, lapply(colnames, function (name) !is.na(df[name]))),]
  a b      c d
1 1 2    one a
3 3 6  three c
4 4 8   four d
6 6 12   six f
7 7 14 seven g
于 2013-03-12T18:20:39.750 回答