質問
read.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")
所属していません StackOverflow