2017-12-12 7 views
1

たとえば、複数のフィールドを再コードしたいとします。性別、婚姻状況、教育などを数字に変換します。すべての文字変数を一度にコード化する関数を作成します。

convert <- function(x,y,z) 
{ 
    if(x[[y]]==z) { 
    x$y=as.factor(1) 
    } else { 
    x$y=as.factor(2) 
    } 
} 
train$Gender <- convert(train,Gender,“Male”) 

にそうmale=1female=2 &しかし、これは(正確=正確なX、I).subset2におけるエラー

エラースロー:レベルでこのようなインデックスを。

何人かは助けてもらえますか?あなたが試した変換のための

+1

y'が計算され、 '場合は、' $ y'を使用することはできません –

+0

'のx、yについての例を提供し、z'してくださいとリテラル名 "y"ではなく、その値を使用します。代わりに 'x [[y]] < - ...'を使ってください( 'if'文のように)。 – JDL

+0

@JDLそれはまだ同じエラーをスローする – New2015

答えて

0

簡単な解決策は次のようになります。

df <- data.frame(Gender = c("male", "male", "female", "male")) 

convert <- function(data, var, label){ 
    data[,var] <- ifelse(is.na(data[,var]), NA, 
          ifelse(data[,var] == label, 1, 2)) 
    return(as.factor(data[,var])) 
} 

df$Gender <- convert(df, "Gender", "male") 

> df 
    Gender 
1  1 
2  1 
3  2 
4  1 

あなただけの数値のレベルに文字列レベルであなたの要因を変換したい場合は、あなたにのためにそれを行うには、このシンプルなコマンドを使用することができますあなたが一度に好きな多くの変数:

例データ:

df <- data.frame(var1 = factor(sample(1:5, 10, replace = TRUE), 1:5, labels = LETTERS[1:5]), 
       var2 = factor(sample(1:5, 10, replace = TRUE), 1:5, labels = LETTERS[6:10]), 
       var3 = factor(sample(1:5, 10, replace = TRUE), 1:5, labels = LETTERS[11:15])) 

> df 
    var1 var2 var3 
1  B F O 
2  A F M 
3  D F N 
4  E F O 
5  B H N 
6  B F M 
7  A F O 
8  E I O 
9  C J N 
10 E J O 

今すぐ変更したい列をループにlapplyを使用して、01を使用します最初の数値レベルで考慮に戻った後、数値に変換する:

df[, c("var1", "var2")] <- lapply(df[, c("var1", "var2")], function(x) as.factor(as.numeric(x))) 

> df 
    var1 var2 var3 
1  2 1 O 
2  1 1 M 
3  4 1 N 
4  5 1 O 
5  2 3 N 
6  2 1 M 
7  1 1 O 
8  5 4 O 
9  3 5 N 
10 5 5 O 

> class(df$var1) 
[1] "factor" 
+0

ソリューションのおかげで、変換する変数を最初にベクトル化してから、 "ifelse"を適用する必要があります – New2015

+0

私は関数を減らしました。一時ベクトルは不要でした。違いはほとんどありませんが、巨大なデータの方が速いかもしれません。しかし、これは2つのレベルの要因にのみ作用します。 – LAP

+0

はい私は同じ&それが私が "ifelse"の代わりに&elseを使用することに熱心だった理由を考えていました。複数のレベルで変数を扱う最良の方法は何ですか? – New2015

関連する問題