2012-10-15 47 views
5

我有一個簡單的數據幀列轉換,可以使用if/else循環完成,但我想知道是否有更好的方法來做到這一點。如何更改數據框中的列值?

初始數據幀,

df <-data.frame(cbind(x=rep(10:15,3), y=0:8)) 
df 
    x y 
1 10 0 
2 11 1 
3 12 2 
4 13 3 
5 14 4 
6 15 5 
7 10 6 
8 11 7 
9 12 8 
10 13 0 
11 14 1 
12 15 2 
13 10 3 
14 11 4 
15 12 5 
16 13 6 
17 14 7 
18 15 8 

什麼,我需要做的是替換列中的值「Y」,使得

'0' gets replaced with '2', 
'1' gets replaced with '2.2', 
'2' gets replaced with '2.4', 
... 
... 
'6' gets replaced with '3.2' 
'7' gets replaced with '3.3' 
'8' gets replaced with '10' 

,使我最終喜歡的東西,

> df 
    x y 
1 10 2.0 
2 11 2.2 
3 12 2.4 
4 13 2.6 
5 14 2.8 
6 15 3.0 
7 10 3.2 
8 11 3.3 
9 12 10.0 
10 13 2.0 
11 14 2.2 
12 15 2.4 
13 10 2.6 
14 11 2.8 
15 12 3.0 
16 13 3.2 
17 14 3.3 
18 15 10.0 

我已經搜索並找到了幾個建議,但無法讓他們工作。其中一個嘗試類似於:

> levels(factor(df$y)) <- c(2,2.2,2.4,2.6,2.8,3,3.2,3.3,10) 

Error in levels(factor(df$y)) <- c(2, 2.2, 2.4, 2.6, 2.8, 3, 3.2, 3.3, : 
    could not find function "factor<-" 

但是,我收到上面顯示的錯誤消息。

任何人都可以幫助我嗎?

+0

對不起,我的錯。我剛剛編輯了我的原始帖子。 –

回答

5

使用的事實,y+1是用於替換

replacement <- c(2,2.2,2.4,2.6,2.8,3,3.2,3.3,10) 
df <- within(df, z <- replacement[y+1]) 
指數

或者,使用data.table代替合成糖和記憶效率

library(data.table) 
DT <- as.data.table(df) 

DT[, z := replacement[y+1]] 
+0

謝謝你,你的建議使用內部工作完美! –

3

如何:

mylevels <- c(2,2.2,2.4,2.6,2.8,3,3.2,3.3,10) 
df$z <- as.numeric(as.character(factor(df$y,labels=mylevels))) 

這也符合您所期望的結果:

transform(df,z=ifelse(y==7,3.3,ifelse(y==8,10,2+y/5))) 
+0

謝謝你。你的建議和mnel的建議一樣。 –

相關問題