1. ホーム
  2. r

[解決済み】data.frameのカラムを因子から文字に変換する

2022-03-25 21:11:55

質問

データフレームを持っています。仮に bob :

> head(bob)
                 phenotype                         exclusion
GSM399350 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399351 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399352 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399353 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399354 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399355 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-

このデータフレームの行を連結したいのですが(これは別の質問になります)。しかし、見てください。

> class(bob$phenotype)
[1] "factor"

Bob の列は要因である。ですから、例えば

> as.character(head(bob))
[1] "c(3, 3, 3, 6, 6, 6)"       "c(3, 3, 3, 3, 3, 3)"      
[3] "c(29, 29, 29, 30, 30, 30)"

よくわからないのですが、これは、(カラクタクス王の宮廷の)列の因子のレベルへの指標なのでしょう。 bob ? 私が必要とするものではありません。

不思議と bob を手作業で行っています。

bob$phenotype <- as.character(bob$phenotype)

で、うまく動作します。そして、いくつか入力した後、列が因子ではなく文字であるdata.frameを取得することができます。そこで質問なのですが、これを自動的に行うにはどうしたらよいのでしょうか?どうすれば因子列を持つdata.frameを文字列を持つdata.frameに変換できるのでしょうか?

おまけの質問:なぜ手動のやり方が有効なのか?

どのように解決するのですか?

MattとDirkの続きです。 グローバルオプションを変更せずに既存のデータフレームを再作成したい場合は、applyステートメントで再作成することができます。

bob <- data.frame(lapply(bob, as.character), stringsAsFactors=FALSE)

これはすべての変数をクラス "文字" に変換するものです。 以下のMarekの解決策 .

@hadley さんのご指摘の通り、以下の方がより簡潔です。

bob[] <- lapply(bob, as.character)

どちらの場合も lapply はリストを出力しますが、R の不思議な特性のおかげで [] の data.frame クラスを保持します。 bob を使用して data.frame に変換する必要がなくなります。 as.data.frame という引数で stringsAsFactors = FALSE .