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)`
}

现在,您的函数需要一个名为dbnascinput 的变量,然后返回该变量以及在该函数期间所做的修改。您可以使用以下方式调用它:

dbnasc <- xclass1(dbnasc, etc, etc)

如果要将结果分配回原始变量。

于 2012-11-29T20:55:57.197 回答
2

如果我理解正确,您正在尝试重新编码一个表示一年的整数变量。所需的转换是将年份间隔变为一年。例如,如果您有年份 c(1988, 1993, 1997, 1999),将它们按十年分组为 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. 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)

谢谢杰夫和亚历山大。

于 2012-11-29T22:57:06.667 回答