16

を使用して変数を因子に変換したいapply():

a <- data.frame(x1 = rnorm(100),
                x2 = sample(c("a","b"), 100, replace = T),
                x3 = factor(c(rep("a",50) , rep("b",50))))

a2 <- apply(a, 2,as.factor)
apply(a2, 2,class)

結果:

         x1          x2          x3 
"character" "character" "character" 

これが因子ベクトルではなく文字ベクトルになる理由がわかりません。

4

1 に答える 1

34

applydata.frame を文字行列に変換します。使用lapply:

lapply(a, class)
# $x1
# [1] "numeric"
# $x2
# [1] "factor"
# $x3
# [1] "factor"

2 番目のコマンド apply で、次を使用して結果を文字行列に変換しますlapply

a2 <- lapply(a, as.factor)
lapply(a2, class)
# $x1
# [1] "factor"
# $x2
# [1] "factor"
# $x3
# [1] "factor"

しかし、簡単な見張りには、次を使用できますstr

str(a)
# 'data.frame':   100 obs. of  3 variables:
#  $ x1: num  -1.79 -1.091 1.307 1.142 -0.972 ...
#  $ x2: Factor w/ 2 levels "a","b": 2 1 1 1 2 1 1 1 1 2 ...
#  $ x3: Factor w/ 2 levels "a","b": 1 1 1 1 1 1 1 1 1 1 ...

コメントによる追加説明:

apply が機能しないのに、lapply が機能するのはなぜですか?

最初に行うことapplyは、引数を行列に変換することです。Soapply(a)は と同等apply(as.matrix(a))です。ご覧のとおり、次のようstr(as.matrix(a))になります。

chr [1:100, 1:3] " 0.075124364" "-1.608618269" "-1.487629526" ...
- attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:3] "x1" "x2" "x3"

これ以上因子はないので、すべての列をclass返します。列で機能するので、必要なものが得られます(列ごとに似たようなことをします)。"character"
lapplyclass(a$column_name)

ヘルプでapply理由applyを確認でき、as.factor機能しません:

すべての場合において、結果は as.vector によって次元が設定される前に基本的なベクトル型の 1 つに強制されます。そのため、(たとえば) 因子の結果は文字配列に強制されます。

ヘルプで確認できる理由sapplyas.factor機能しないsapply:

値 (...) X と同じ長さの原子ベクトルまたは行列またはリスト (...) 単純化が発生した場合、出力型は階層内の戻り値の最も高い型から決定されます NULL < 生 < 論理 <ペアリストをリストに強制した後、整数 < 実数 < 複合体 < 文字 < リスト < 式。

因子またはdata.frameのマトリックスを取得することはありません。

出力を に変換する方法はdata.frame?

シンプルで、as.data.frameコメントに書いたように使用してください:

a2 <- as.data.frame(lapply(a, as.factor))
str(a2)
'data.frame':   100 obs. of  3 variables:
 $ x1: Factor w/ 100 levels "-2.49629293159922",..: 60 6 7 63 45 93 56 98 40 61 ...
 $ x2: Factor w/ 2 levels "a","b": 1 1 2 2 2 2 2 1 2 2 ...
 $ x3: Factor w/ 2 levels "a","b": 1 1 1 1 1 1 1 1 1 1 ...

ただし、選択した文字列を次のように置き換えたい場合factorは、トリックがあります。

a3 <- data.frame(x1=letters, x2=LETTERS, x3=LETTERS, stringsAsFactors=FALSE)
str(a3)
'data.frame':   26 obs. of  3 variables:
 $ x1: chr  "a" "b" "c" "d" ...
 $ x2: chr  "A" "B" "C" "D" ...
 $ x3: chr  "A" "B" "C" "D" ...

columns_to_change <- c("x1","x2")
a3[, columns_to_change] <- lapply(a3[, columns_to_change], as.factor)
str(a3)
'data.frame':   26 obs. of  3 variables:
 $ x1: Factor w/ 26 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ x2: Factor w/ 26 levels "A","B","C","D",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ x3: chr  "A" "B" "C" "D" ...

次を使用して、すべての列を置き換えるために使用できます。

a3 <- data.frame(x1=letters, x2=LETTERS, x3=LETTERS, stringsAsFactors=FALSE)
a3[, ] <- lapply(a3, as.factor)
str(a3)
'data.frame':   26 obs. of  3 variables:
 $ x1: Factor w/ 26 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ x2: Factor w/ 26 levels "A","B","C","D",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ x3: Factor w/ 26 levels "A","B","C","D",..: 1 2 3 4 5 6 7 8 9 10 ...
于 2010-03-06T11:42:21.277 に答える