2016-07-01 2 views
3

私はSASデータセットをRに読み込んでいますが、文字値が空の引用符として空になっていますが、ありがたいことにzap_empty()はこれらの値をNAに変換します。tbl_df列クラスの識別

私のデータセットには約400個の変数が含まれていますが、私はむしろそれらを個別にチェックしません。変数が文字であるかどうかを確認し、zap_empty()を適用するループを作成したいと考えています。

read_sas()data.frameの代わりにtbl_dfとしてデータをインポートします。最初にデータをdata.frameに変換すると、次のループが機能します。

tbl_dfを使用してブールテストで列クラスを識別する方法を理解したいと思います。以下はread_sas()havenから読み取ったSASデータセットの例です。

> wolves <- read_sas('http://psych.colorado.edu/~carey/Courses/PSYC7291/DataSets/SAS/wolves.sas7bdat') 
> 
> # The first 3 variables are characters 
> glimpse(wolves) 
Observations: 25 
Variables: 13 
$ location (chr) "rm", "rm", "rm", "rm", "rm", "rm", "rm", "rm", "rm"... 
$ wolf  (chr) "rmm1", "rmm2", "rmm3", "rmm4", "rmm5", "rmm6", "rm"... 
$ sex  (chr) "m", "m", "m", "m", "m", "m", "f", "f", "f", "m", "m"... 
$ x1  (dbl) 126, 128, 126, 125, 126, 128, 116, 120, 116, 117, 1... 
$ x2  (dbl) 104, 111, 108, 109, 107, 110, 102, 103, 103, 99, 10... 
$ x3  (dbl) 141, 151, 152, 141, 143, 143, 131, 130, 125, 134, 1... 
$ x4  (dbl) 81.0, 80.4, 85.7, 83.1, 81.9, 80.6, 76.7, 75.1, 74.... 
$ x5  (dbl) 31.8, 33.8, 34.7, 34.0, 34.0, 33.0, 31.5, 30.2, 31.... 
$ x6  (dbl) 65.7, 69.8, 69.1, 68.0, 66.1, 65.0, 65.0, 63.8, 62.... 
$ x7  (dbl) 50.9, 52.7, 49.3, 48.2, 49.0, 46.4, 45.4, 44.4, 41.... 
$ x8  (dbl) 44.0, 43.2, 45.6, 43.8, 42.4, 40.2, 39.0, 41.1, 44.... 
$ x9  (dbl) 18.2, 18.5, 17.9, 18.4, 17.9, 18.2, 16.8, 16.9, 17.... 
$ subject (dbl) 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ... 
> 
> # But my loop cannot identify that 
> for (i in 1:ncol(wolves)){ 
+ if (is.character(wolves[,i])){ 
+  print('bar') 
+ } else {print('foo')} 
+ } 
[1] "foo" 
[1] "foo" 
[1] "foo" 
[1] "foo" 
[1] "foo" 
[1] "foo" 
[1] "foo" 
[1] "foo" 
[1] "foo" 
[1] "foo" 
[1] "foo" 
[1] "foo" 
[1] "foo" 

私はそれが文字として識別され$を使用して列にアクセスしますが、インデックスを使用しない場合

ループを使用して
> class(wolves$sex) 
[1] "character" 
> class(wolves[,'sex']) 
[1] "tbl_df"  "data.frame" 

、私は文字変数ですtbl_dfオブジェクトからどの列をどのように特定することができますか?


から@Sumedhから、どの列が文字であるかを識別できるようになりました。
このエラーは、ループ内でzap_empty()を使用できないことを意味しますか?

> for (i in seq(which(sapply(wolves, class) == 'character'))){ 
+ wolves[,i] <- zap_empty(wolves[,i]) 
+ } 
Show Traceback 

Rerun with Debug 
Error: is.character(x) is not TRUE 
+0

を、私は 'クラスを使用する場合(wolves [、 'sex']) '、私は出力として' 'character" 'を得ます。 – Sumedh

+0

私はまだ" "tbl_df" data.frame "を取得しました。私はhaven_0.2.0.9000とdplyr_0.4.3を持っています。 –

+0

'haven 0.2.0'と' dplyr 0.4.3'では正しい結果が得られます。 – Jaap

答えて

1
あなたは単一列のデータフレームを文字ベクトルに is.character(x)をテストしていないことを確認してくださいしたいと思う

is.character(x[,i])は、1つの括弧の添字が常に同じタイプのオブジェクトを返すため、文字を正しくチェックしていません。 xはデータフレームであるため、x[,i]もデータフレームです。文字ベクトルを取得するには、x[,i]の単一列データフレームの最初のベクトルを[[1]]で選択します。

x <- as.data.frame(mydf) 
for (i in seq(ncol(x))) { 
    if(is.character(x[,i][[1]])){ 
    x[,i] <- zap_empty(x[,i][[1]]) 
    } 
} 

これは、ここでは、データ・サイエンスの本のためのRに、より良く、より徹底的に説明されている:ループせずにこれを行うにはhttp://r4ds.had.co.nz/vectors.html#recursive-vectors-lists

一つの方法:

FYI
character_vars <- lapply(x, class) == "character" 
x[, character_vars] <- lapply(x[, character_vars], zap_empty) 
関連する問題