2016-12-12 5 views
1

データにRが含まれていて、欠損データ用の特殊文字列が含まれています。私は 有効なデータとだけの1つにsubset元のデータフレームにしたいと思います。因子レベルが数値か文字列かどうかを検出するR

次の例では、いくつかの数値と欠損データの2つの文字列(MD1およびMD2)があります。

DF <- data.frame(x = c(1, 2, 3, "MD1", 5, "MD2")) 

わずか数このような文字列があった場合、私はそれらを列挙し、(これは私がそれをしたかではなく、それはシンプルだし、この質問の目的に合っ)のサブセットを抽出できます。

DF.invalid <- droplevels(subset(DF, x == "MD1" | x == "MD2")) 
DF.valid <- subset(DF, x != "MD1" & x != "MD2") 
DF.valid$x <- as.numeric(levels(DF.valid$x))[DF.valid$x] 

私の問題は、欠落しているデータ文字列があらかじめわかっていない可能性があることです。 MD1MD2が非数値であることを検出する適切な(エレガントな)方法があり、データフレームを検査して非数値レベルを列挙することなくこの結果を達成できますか?

+1

'as.numeric(levels(df $ x)[df $ x])'を実行し、 'NA'になるものは非数値です。 –

答えて

1

xを、データフレームdatの "数値と文字の混在レベル"(実際はすべてのレベルが文字です)とする要因列とします。 、使用を "文字レベル" を抽出するために

na.idx <- is.na(suppressWarnings(as.numeric(levels(x)))) 
non.num.levels <- levels(x)[na.idx] 

あなたはそれらのレベルでdatをサブセットする場合は、

subset(dat, x %in% non.num.levels) 

を使用することができますが、より良い方法は経由です:

subset(dat, na.idx[x]) 
+0

あなたの意見では、data.framesの代わりにここでdata.tableを使用する必要がありますか? – philsf

関連する問題