如何记录特定列?

时间:2015-03-03 20:14:58

标签: r

我有这个数据

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

一个做三件事的功能

  • 基于提到的'模型'的子集(df的列名之一)
  • 输出dfcal 3列
  • 使用这些值的日志输出dfcallog

功能

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列上应用日志吗?

1 个答案:

答案 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错误。