2014-12-07 200 views
0

這裏的一個數據幀我正在使用:轉換一個數據幀爲數值數據幀中的R

c1 = c('a', 'b', 'c', 'd') 
c2 = c('d', 'a', 'd', 'c') 
c3 = c('a', 'c', 'd', 'b') 
c4 = c('a', 'c', 'b', 'd') 
df = data.frame(c1, c2, c3, c4) 

c1 c2 c3 c4 
a  d  a  a 
b  a  c  c 
c  d  d  b 
d  c  b  d 

我想使用這種規模轉換:A = 1,B = 2,C = 3,d = 4。 所以,我得到這樣的:

c1 c2 c3 c4 
    1 4 1 1 
    2 1 3 3 
    3 4 4 2 
    4 3 2 4 

這是我想出了:

for(i in colnames(df)){ 
    df$i = gsub("a", 1, df$i) 
    df$i = gsub("b", 2, df$i) 
    df$i = gsub("c", 3, df$i) 
    df$i = gsub("d", 4, df$i) 
} 

但它不工作。我應該在這裏使用gsub,還是有更簡單的方法來做到這一點?

+1

類似下面的答案,如果你的關鍵是不連續的,你可以把你自己的'鍵<做 - C(「A」 =「1」,「B '='2','c'='3','d'='4'); df [] < - key [as.matrix(df)]' – rawr 2014-12-07 04:13:24

回答

3

我們可以通過幾種方法做到這一點。一種方法是將data.frame轉換爲matrix,然後match將數據集中的元素轉換爲unique。即在這種情況下爲letters[1:4]。但結果將是一個向量。我們可以通過將dim指定爲dim(df)即,將其轉換爲原始數據集的相同dimensionsdim<-(..., dim(df)。另請檢查here以瞭解有關任務的更多詳情。

df2 <- df 
df2[] <- `dim<-`(match(as.matrix(df), letters[1:4]), dim(df)) 
df2 
# c1 c2 c3 c4 
#1 1 4 1 1 
#2 2 1 3 3 
#3 3 4 4 2 
#4 4 3 2 4 

上面的代碼可以被分成單獨的行:

v1 <- match(as.matrix(df), letters[1:4]) 
df2[] <- `dim<-`(v1, dim(df)) 

df2[] <- matrix(v1, ncol=ncol(df), row=nrow(df)) 

另一種選擇是數據集中列轉換爲factor指定爲數據集的唯一值的電平然後通過as.numeric將其轉換爲numeric。這可以在使用looplapply

df2[] <-lapply(df, function(x) as.numeric(factor(x, levels=letters[1:4]))) 
+0

真的很不錯,和我腦子裏想的差不多,但是在一行中這樣做有點像炫耀,你不覺得嗎? :)分離出來,並解釋一點我肯定會不勝感激。 – Aaron 2014-12-07 03:52:17

+0

@Aaron我會分解代碼並解釋。 – akrun 2014-12-07 03:53:23

+0

@akrun,'dim <-'在這裏做什麼?這是r的內置函數嗎? – 2014-12-07 04:05:06