2017-04-08 5 views
0

「F」および「D +」から「A」までの項目(グレード)を持つ「グレード」列を持つCSVファイルがあります。 'A +')。だから私がしたいのは、例えば 'A'の値を4.0(数値)に、 'A-'を3.7(もう一度 - 数値)に変換することです。グレード(文字列)から数値(GPA)への列エントリを変更できません

はこれまでのところ、私はplyrライブラリから切り上げ()を試してみましたが、それはうまくいきませんでした。

 filtered_data$Grade <- 
     as.numeric(as.character(revalue(filtered_data$Grade, 
     +         c("A"="4.0", "A-"="3.7", 
     +          "B+" = "3.3", "B" = "3.0", 
     +          "B-" = "2.7", "C+" = "2.3", 
     +          "C" = "2.0", "C-" = "1.7", 
     +          "D+" = "1.3", "D" = "1.0", 
     +          "F" = "0.0")))) 
     Error in revalue(filtered_data$Grade, c(A = "4.0", `A-` = "3.7", 
     `B+` = "3.3", : 
     x is not a factor or a character vector. 

私もas.numeric(as.character(FOO))でいくつかのトリックをやってみましたが、これは同様に動作しませんでした。私は列のすべてのエントリを変更するループためを実装しようとしたので、

第三に、「ハードコーディング」メソッドは、同様に動作しませんでしたが、私は、事前にこのメッセージに

Warning message: 
    In `[<-.factor`(`*tmp*`, i, value = c(11L, 16L, 5L, 13L, 8L, 16L, : 
    invalid factor level, NA generated 

おかげです!要因にあなたの等級列を変更

+0

ルックアップテーブルとして値を持つデータフレームを定義し、それを元のデータにマージして、数値で新しい変数を作成することができます。例えば。グレード= c(「A」、「A-」、「B +」、「B」、「B-」、「C +」、「C」、「C-」、「D +​​」) 、 "D"、 "F")、Grade_num = c(4.0,3.7,3.3,3.0,2.7,2.3,2.0,1.7,1.3,1.0,0))である。そして、 'filtered_data < - merge(x = filtered_data、y = lookupTable、by =" Grade ")' – ikop

答えて

1

があなたの第一の方法でトリックを行います:

filtered_data<-data.frame(Grade=c("A","B+", "C", "A-","D","B", "B-","C+","C-","D+","F")) 
filtered_data$Grade <- as.factor(filtered_data$Grade) 

filtered_data$Grade <- revalue(filtered_data$Grade, 
    c("A"="4.0", "A-"="3.7", 
    "B+" = "3.3", "B" = "3.0", 
    "B-" = "2.7", "C+" = "2.3", 
    "C" = "2.0", "C-" = "1.7", 
    "D+" = "1.3", "D" = "1.0", 
    "F" = "0.0")) 
+0

ありがとう!これはうまくいった。 – oneturkmen

+0

最初の行が因子変数としてグレード列を返したため、2行目は必要ありません。私はあなたがエラーの原因を正しく特定したとは思わない。典型的な 'read。* '関数で読み込まれたデータフレームがあれば、任意の文字値の列が要素になります。 –

1

私はあなたにエラーが発生した場所を確認していないが、私はより参照ベクトルを使用するはるかに簡単な方法があると思います新しいパッケージと関数を求めています:

> trans.vec= c("A"="4.0", "A-"="3.7", 
+ "B+" = "3.3", "B" = "3.0", 
+ "B-" = "2.7", "C+" = "2.3", 
+ "C" = "2.0", "C-" = "1.7", 
+ "D+" = "1.3", "D" = "1.0", 
+ "F" = "0.0") 

名前付きベクトルが作成されました。それからちょうどそのベクトルに適用される抽出機能によってグレードの列の値をプッシュすることができます:

> filtered_data$num.char <- trans.vec[filtered_data$Grade] 
> filtered_data 
    Grade num.char 
1  A  4.0 
2  B+  2.7 
3  C  2.3 
4  A-  3.7 
5  D  1.3 
6  B  3.3 
7  B-  3.0 
8  C+  1.7 
9  C-  2.0 
10 D+  1.0 
11  F  0.0 
> str(filtered_data) 
'data.frame': 11 obs. of 2 variables: 
$ Grade : Factor w/ 11 levels "A","A-","B","B-",..: 1 5 6 2 9 3 4 8 7 10 ... 
$ num.char: chr "4.0" "2.7" "2.3" "3.7" ... 

ベクトルの値が文字である必要はありません。あなたは以下のように名前の数値ベクトルを使用して、すべてのas.character.as.numeric folderolをSKPできます

> trans.vec.num= c("A"=4.0, "A-"=3.7, 
+ "B+" = 3.3, "B" = 3.0, 
+ "B-" = 2.7, "C+" = 2.3, 
+ "C" = 2.0, "C-" = 1.7, 
+ "D+" = 1.3, "D" = 1.0, 
+ "F" = 0.0) 
> filtered_data$num.num <- trans.vec.num[filtered_data$Grade] 
> str(filtered_data) 
'data.frame': 11 obs. of 3 variables: 
$ Grade : Factor w/ 11 levels "A","A-","B","B-",..: 1 5 6 2 9 3 4 8 7 10 ... 
$ num.char: chr "4.0" "2.7" "2.3" "3.7" ... 
$ num.num : num 4 2.7 2.3 3.7 1.3 3.3 3 1.7 2 1 ... 

元グレードの列が要因であったが、それは「[」-functionを気にしませんでしたということに注意してください。

関連する問題