2017-04-08 75 views
0

我有一個CSV文件,其中有'等級'列,條目(等級)從'F'和'D +'等於'A'(不是'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(富)),但這並沒有正常工作。

三,「硬編碼」的方法,因爲我試圖執行for循環改變在一列中的每個條目沒有工作好,但我提前得到這個消息

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

謝謝!

+0

您可以將數據框定義爲查找表,然後將其合併到原始數據中,從而創建一個帶有數字值的新變量。例如。 'lookupTable < - data.frame(Grade = 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

由於第一行將等級列作爲因子變量返回,因此不需要第二行。我認爲你沒有正確識別錯誤的來源。如果有一個數據框被讀入了典型的'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" ... 

向量的值不需要是字符。你可以通過下面一個名爲數字矢量SKP所有as.character.as.numeric胡鬧:

> 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 ... 

注意,原來級柱是一個因素,但沒有打擾「[」 - 函數。

相關問題