我在动物园包中使用'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很新,这就是为什么我的编码可能有点尴尬(特别是'创建当前日期'部分):))
干杯,
佛瑞德
答案 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
有时不能是数字,有时也可能是字符串。$
的列;并应使用:=
而不是df$newcol <-
或transform
创建列。查看the excellent tutorials即可开始使用。