使用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
}
}
答案 0 :(得分: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)
如果要将结果分配回原始变量。
答案 1 :(得分: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
答案 2 :(得分:1)
在检查Jeff的解决方案之后,我的函数重新编码看起来像:
数据帧
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)
谢谢Jeff和Alexander。