一起使用 ifelse 和 as.yearmon

Using ifelse and as.yearmon together

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

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

这是我的代码:

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

我只有在没有暂停日期的情况下才会收到 NA...我不明白为什么。你能帮忙吗,漂亮吗? 请注意,我是 R 的新手,这就是为什么我的编码可能有点笨拙(尤其是 'create current date' 部分):)

干杯,

弗雷德

假设您希望最终结果看起来像 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 开始。