4

複数の行と複数の列を含むデータフレームがあります。

データフレームのいくつかの列の名前を含む文字ベクトルがあります。列の数はさまざまです。

行ごとに、これらの列ごとに、そのうちの1つがNAでないかどうかを識別する必要があります。(基本的any(!is.na(df[namecolumns]))に各行に対して)、次に、であるもののサブセットを実行しますTRUE

実際にany(!is.na(df[1,][namescolumns]))はうまく機能しますが、それは最初の行だけです。

プログラマーとしての最初の反射であり、最初の行で機能するため、forループを簡単に実行できますが、それはR方法ではなく、"apply"lapply、、、、または他の)、しかし私はどれとどのように理解することはできません。mapplysapplytapply

ありがとうございました。

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 に答える