2012-11-29 23 views
3

使用R腳本時遇到困難。如果我在命令行中運行這行它完美R腳本錯誤 - 將值應用於數據幀變量

dbnasc$ano[which(dbnasc$ano>=1605 & dbnasc$ano<1610)]=1605 

但是,如果與它相同的代碼定義一個函數不起作用

#Função recode 
xclass1=function(ini,fim,per){ 
t=seq(ini,fim,by=per) 
z=length(t) 
i=1 
while(i<z){ 
    a0=t[[i]] 
    a1=t[[i+1]] 
    dbnasc$ano[which(dbnasc$ano>=a0 & dbnasc$ano<a1)] = a0 
    i=i+1 
    } 
} 
+4

快速指針:R在分配時使用'<--'代替'='是R中的「最佳實踐」。 –

回答

3

(幾乎)所有功能應該返回的東西。你的函數不會返回任何東西,所以任何變量都不會被修改(除了那些暫時存在才能執行的變量外)。

,請返回要使用return()函數在函數的堅持到底的變量,也可以忽略return,只是給變量名:

#Função recode 
xclass1=function(dbnasc, ini,fim,per){ 
    t=seq(ini,fim,by=per) 
    z=length(t) 
    i=1 
    while(i<z){ 
    a0=t[[i]] 
    a1=t[[i+1]] 
    dbnasc$ano[which(dbnasc$ano>=a0 & dbnasc$ano<a1)] = a0 
    i=i+1 
    } 
    dbnasc 
    #or `return(dbnasc)` 
} 

現在你的函數需要一個變量命名dbnasc作爲輸入,然後返回該變量與該函數期間所做的修改。你可以使用類似這樣的方式來調用它:

dbnasc <- xclass1(dbnasc, etc, etc) 

如果你想分配結果回原始變量。

+0

謝謝傑夫!我是R的初學者,我正在給函數的第一步。你的解決方案工作得很好。 –

2

如果我理解正確,您正在嘗試重新編碼一個代表一年的整數變量。所需的轉換是將幾年的時間間隔轉換爲一年。例如。如果你有c年(1988年,1993年,1997年,1999年),將它們分成c年(1980,1990,1990,1990)十年。如果這確實是你的願望,有一個簡單的方法:

> x <- c(1988, 1993, 1997, 1999) 
> x - x %% 10 
[1] 1980 1990 1990 1990 
+0

謝謝亞歷山大!我是R的初學者,我對它的靈活性感到驚訝......我也會嘗試這個解決方案,但我試圖建立我的第一個功能,傑夫的答案工作得很好。 –

+0

這些被稱爲_vectorized operators_;它被應用於整個向量,而不需要迭代它。矢量化運算符的優點是代碼更簡潔,處理速度更快(大大提高)。 –

+0

嗨亞歷山大,我試過你的解決方案,事實上,它非同尋常!一個簡單的命令,我完成了所有的工作。我正在成爲一名R球迷。謝謝你的幫助。 –

1

入住後傑夫的解決方案我的功能重新編碼,看起來像這樣:

  1. year.recoded <- year - year %% interval 
    

    在控制檯中的一個例子

    DATAFRAME

    dataframe

  2. xclass11功能到一年datanasc給第一最後間隔重新編碼。


#Função recode 
xclass11=function(ini,fim,per){ 
t=seq(ini,fim,by=per) 
z=length(t) 
i=1 
ano=as.numeric(format(as.Date(dbnasc$datanasc), "%Y")) 
while(i<z){ 
    a0=t[[i]] 
    a1=t[[i+1]] 
    ano[which(ano>=a0 & ano<a1)]=a0 
    i=i+1 
    } 
dbnasc=cbind(dbnasc,ano) 
return(dbnasc) 
} 

要使用該功能

dbnasc = xclass11(1600,1900,25)

謝謝傑夫和亞歷山大。