一起使用ifelse和as.yearmon

时间:2015-08-24 21:00:39

标签: r if-statement data.table zoo

我在动物园包中使用'ifelse'语句和'as.yearmon'时遇到了一些问题。

我的初始数据集类似于'df'。从中,我想计算每一行的持续时间。首先,我创建了一个包含开始日期('initdate')的列,然后是另一个包含结束日期('enddate')的列,如果有的话,它必须对应于暂停日期,如果有,则必须对应于当前日期无。

这是我的代码:

require(data.table)
require(zoo)

df <- data.table(id=c(1:3), month1=c(3,2,5), year1=c(2011,2012,2014), monthsusp=c(2,NA,NA), yearsusp=c(2012,NA,NA), weight=c(1,1,1))

#Add column with concatenated 'month year'
df$initdate <- as.yearmon(paste(df$month1,df$year1, sep = "-"),"%m-%Y")

#Create 'current date’
date <- Sys.Date()  #to get current system's date
x <- format(date,"%m")
y <- format(date,"%Y")
df$curmonth <- x
df$curyear <- y

#Add column with current date OR suspension date if any
df <- transform(df, enddate = ifelse(yearsusp > 1, monthsusp, as.yearmon(paste(df$curmonth,df$curyear, sep = "-"),"%m-%Y")))

我没有暂停日期时只能获得NAs ...我不明白为什么。你能帮忙吗,好吗? 请注意,我对R很新,这就是为什么我的编码可能有点尴尬(特别是'创建当前日期'部分):))

干杯,

佛瑞德

1 个答案:

答案 0 :(得分:1)

假设您希望最终结果看起来像initdate列...

# wrap the conversion in a function
myym <- function(m,y){
    if (is.numeric(m)) m <- sprintf("%02d",m)
    as.yearmon( paste(m,y,sep="-"), "%m-%Y")
}

# initialize to the current yearmon
df[, enddate := myym(curmonth,curyear) ]

# overwrite with the yearmon from the data if available
df[ !is.na(monthsusp) , enddate := myym(monthsusp,yearsusp) ]

这给出了

   id month1 year1 monthsusp yearsusp weight initdate curmonth curyear  enddate
1:  1      3  2011         2     2012      1 Mar 2011       08    2015 Feb 2012
2:  2      2  2012        NA       NA      1 Feb 2012       08    2015 Aug 2015
3:  3      5  2014        NA       NA      1 May 2014       08    2015 Aug 2015

有几点需要注意:

  • 注意输入和输出的类别。 enddate有时不能是数字,有时也可能是字符串。
  • 如果你正在使用data.table,你可以而且应该引用没有$的列;并应使用:=而不是df$newcol <-transform创建列。查看the excellent tutorials即可开始使用。