一起使用 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 开始。
我在使用 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 开始。