10

いつものように、パッケージspss.getから関数を使用して R にインポートした SPSS ファイルを取得しました。のすべての変数に追加するクラスにHmisc悩まされているため、削除したいと考えています。labelledHmisc::spss.getdata.frame

labelledggplotクラスは、実行しようとするとき、または単純な分析を行いたいときでさえ、頭痛の種になります。labelled1 つの解決策は、 の各変数からクラスを削除することdata.frameです。どうやってやるの?それはまったく可能ですか?そうでない場合、他にどのような選択肢がありますか?

私は本当に「ゼロから」変数を再編集することをバイパスしたい.as.data.frame(lapply(x, as.numeric))そしてas.character、私は確かにSPSSを実行してラベルを手動で削除したくない.

ありがとう!

4

5 に答える 5

4

引数 use.value.labels=FALSE を使用すると、spss.get で「ラベル付き」変数を作成することを回避できます。

w <- spss.get('/tmp/my.sav', use.value.labels=FALSE, datevars=c('birthdate','deathdate'))

ラベル付きベクトルのクラスが c("labelled", "factor") ではなく単に "labelled" である場合、Bhattacharya のコードは失敗する可能性があります。

class(x[[i]]) <- NULL  # no error from assignment of empty vector

報告されたエラーは、次のコードで再現できます。

> b <- 4:6
> label(b) <- 'B Label'
> str(b)
Class 'labelled'  atomic [1:3] 4 5 6
  ..- attr(*, "label")= chr "B Label"
> class(b) <- class(b)[-1]
Error in class(b) <- class(b)[-1] : 
  invalid replacement object to be a class string
于 2010-12-29T02:16:07.433 に答える
2

パッケージread.spssから機能を試すことができます。foreign

labelledによって作成されたクラスを取り除くための大雑把で準備の整った方法spss.get

for (i in 1:ncol(x)) {
    z<-class(x[[i]])
    if (z[[1]]=='labelled'){
       class(x[[i]])<-z[-1]
       attr(x[[i]],'label')<-NULL
    }
}

labelledしかし、問題を引き起こす例を教えてください。

によって作成されMAEDたデータ フレームに変数がある場合、次のようになります。xspss.get

> class(x$MAED)
[1] "labelled" "factor"  
> is.factor(x$MAED)
[1] TRUE

したがって、因数を期待する適切に作成されたコード (たとえば) には問題はありません。

于 2010-03-07T10:24:19.707 に答える
1

仮定する:

library(Hmisc)
w <- spss.get('...')

次を使用して、「var1」という変数のラベルを削除できます。

attributes(w$var1)$label <- NULL

「ラベル付き」クラスも削除したい場合は、次のようにします。

class(w$var1) <- NULL 

または、変数に複数のクラスがある場合:

class(w$var1) <- class(w$var1)[-which(class(w$var1)=="labelled")]

お役に立てれば!

于 2011-03-09T19:42:16.910 に答える
0

さて、unclass関数を利用してクラスを削除できることがわかりました (誰が言うでしょうか?!):

library(Hmisc)
# let's presuppose that variable x is gathered through spss.get() function
# and that x is factor
> class(x)
[1] "labelled" "factor"
> foo <- unclass(x)
> class(foo)
[1] "integer"

それは最も幸運な解決策ではありません.ベクトルの逆変換を想像してみてください...誰かがこれを上回ったら、私はそれを答えとしてチェックします...

于 2010-03-10T20:01:31.240 に答える