質問

read.csv()

を使用してRにロードできるデータファイルのCSVがあります

一部のデータが欠落しているので、データフレームを縮小して、完全に欠落していないデータのみで構成されるセットにします。つまり、NULLがどこかに現れる場合、その列と行をフィルターから除外しますデータセット。

組み込みのRベクトル演算を使用してこれをおそらくかなり簡単に実行できることは知っていますが、これを正確に行う方法はわかりませんか?

私の質問をもう少し具体的にするために、ここにデータの簡単なサンプルを示しますので、あなたが何をしたいのかを見ることができます。

DocID       Anno1    Anno7  Anno8
1           7        NULL   8
2           8        NULL   3
44          10       2      3
45          6        6      6
46          1        3      4
49          3        8      5
62          4        NULL   9
63          2        NULL   4
67          11       NULL   3
91          NULL     9      7
92          NULL     7      5
93          NULL     8      8

したがって、この入力が与えられた場合、出力をこれに減らすコードが必要です。

DocID       Anno8
44          3
45          6
46          4
49          5

Anno8はNULL以外のデータを持つ唯一の列であり、非NULLデータを持つ行は4行のみです。

役に立ちましたか?

解決

xが自分のdata.frame(またはmatrix)である場合

x[ ,apply(x, 2, function(z) !any(is.na(z)))]

例ではNULLを使用しているため、is.na(·)is.null(·)

に置き換えられます

別の方法として、subset(·)を見ることができます。

他のヒント

na.omit()を使用して、欠落している行を削除できますが、それは望みのものではありません。さらに、現在受け入れられている答えは間違っています。完全な列が提供されますが、1つ以上の欠損値がある行は削除されません。正解は次のように取得できます。

> a <- data.frame(a=c(1,2),b=c(NA,1), c=c(3,4))
> a
  a  b c
1 1 NA 3
2 2  1 4
> na.omit(a)[,colSums(is.na(a))==0]
  a c
2 2 4

上記の答えが間違っていることを確認するには:

> a[ ,apply(a, 2, function(z) !any(is.na(z)))]
  a c
1 1 3
2 2 4

列2のNAのため、行1を削除する必要があります。

a <- data.frame(a=c(1,2,0,1),b=c(NA,1,NA,1), c=c(3,4,5,1))

na.omit(a)
  a b c
2 2 1 4
4 1 1 1

a[rowSums(is.na(a))==0,]
  a b c
2 2 1 4
4 1 1 1

a[complete.cases(a),]
  a b c
2 2 1 4
4 1 1 1

また、sqldfがデータフレームの場合、xライブラリを使用して実行できます:

library(sqldf)
result <- sqldf("SELECT DocID, Anno8 FROM x
                 WHERE Anno1 IS NOT NULL AND Anno7 IS NOT NULL")
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top