3

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

3 に答える 3

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)

結果を元の変数に代入したい場合。

于 2012-11-29T20:55:57.197 に答える
2

私の理解が正しければ、年を表す整数変数を再コード化しようとしています。必要な変換は、数年の間隔を 1 年に変えることです。たとえば、年が c(1988, 1993, 1997, 1999) の場合、それらを 10 年ごとにグループ化して c(1980, 1990, 1990, 1990) にします。これが本当にあなたが望むものなら、もっと簡単な方法があります:

year.recoded <- year - year %% interval

コンソールの例:

> x <- c(1988, 1993, 1997, 1999)
> x - x %% 10
[1] 1980 1990 1990 1990
于 2012-11-29T21:12:05.877 に答える
1

Jeff のソリューションを確認した後、関数の再コードは次のようになります。

  1. データフレーム

    データフレーム

  2. firstlastintervalを指定して datanasc から年を再コード化するxclass11 関数


#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)

ジェフとアレクサンダーに感謝します。

于 2012-11-29T22:57:06.667 に答える