我有这个数据
structure(list(DATE = 19620101:19620106, PRECIP = c(10.54, 6.39,
0.01, 0, 0.02, 20.94), OBS_Q = c(2.39, 2.38, 2.22, 2.24, 2.26,
5.13), swb = c(4.11, 3.92, 3.8, 3.8, 3.77, 7.16), gr4j = c(3.7,
4.24, 3.73, 3.24, 2.98, 4.93), isba = c(4.82, 3.44, 4.18, 3.01,
2.88, 6.35), noah = c(3.11, 2.84, 2.57, 2.59, 2.84, 4.83), sac = c(2.83,
2.84, 2.73, 2.87, 2.94, 6), swap = c(2.16, 2.56, 2.08, 2.19,
3.65, 4.43), vic.mm.day. = c(3.44, 3.14, 3.37, 3.15, 2.88, 4.52
)), .Names = c("DATE", "PRECIP", "OBS_Q", "swb", "gr4j", "isba",
"noah", "sac", "swap", "vic.mm.day."), row.names = c(NA, 6L), class = "data.frame")
一个做三件事的功能
功能
dataprep.allcal<-function(df,model){
dfcal<<-subset(df, select=c("DATE",model, "OBS_Q"))
dfcallog<-subset(df, select=c("DATE",model, "OBS_Q"))
cols<-colnames(dfcallog)
dfcallog[cols] <<- log(dfcallog[cols])
}
dataprep.allcal(df=df,model='sac')
这个问题,它也将日期转换为日志。
您能告诉我如何仅在模型和OBS_Q列上应用日志吗?
答案 0 :(得分:1)
这是通过从DATE
变量中排除cols
来实现此目的的方法:
dataprep.allcal<-function(df,model){
dfcal<<-subset(df, select=c("DATE",model, "OBS_Q"))
#need to use the <<- operator below
dfcallog<<-subset(df, select=c("DATE",model, "OBS_Q"))
cols<-colnames(dfcallog)
cols<-cols[!cols %in% 'DATE']
dfcallog[cols] <<- log(dfcallog[cols])
}
dataprep.allcal(df=df,model='sac')
输出:
> dfcal
DATE sac OBS_Q
1 19620101 2.83 2.39
2 19620102 2.84 2.38
3 19620103 2.73 2.22
4 19620104 2.87 2.24
5 19620105 2.94 2.26
6 19620106 6.00 5.13
> dfcallog
DATE sac OBS_Q
1 19620101 1.040277 0.8712934
2 19620102 1.043804 0.8671005
3 19620103 1.004302 0.7975072
4 19620104 1.054312 0.8064759
5 19620105 1.078410 0.8153648
6 19620106 1.791759 1.6351057
注意:
我不知道这是否是拼写错误,但您应该dfcallog<-subset(df, select=c("DATE",model, "OBS_Q"))
使用<<-
运算符,因为在开头使用<-
运算符,然后{{1}函数中最后一个命令的运算符将产生错误,因为<<-
查看<<-
以查找变量,因此会出现parent.environment
错误。