R 在连接日期变量的元素时使用ifelse语句

R 在连接日期变量的元素时使用ifelse语句,r,if-statement,dplyr,R,If Statement,Dplyr,我试图使用两个ifelse语句来创建一个新的日期变量,该变量通过一系列假设来填补现有日期变量的空白。以下是我的意思的一个例子: id EffectiveDate EffectiveYear ED_NA EY_NA NewEffectiveDate 1 a 1972-10-05 1972 FALSE FALSE 1972-10-05 2 a <NA> 1985 TRUE FALSE 1985-

我试图使用两个ifelse语句来创建一个新的日期变量,该变量通过一系列假设来填补现有日期变量的空白。以下是我的意思的一个例子:

  id EffectiveDate EffectiveYear ED_NA EY_NA NewEffectiveDate
1  a    1972-10-05          1972 FALSE FALSE       1972-10-05
2  a          <NA>          1985  TRUE FALSE       1985-01-01
3  a    1988-11-12          1988 FALSE FALSE       1988-11-12
4  b    2011-09-05          2011 FALSE FALSE       2011-09-05
5  b          <NA>            NA  TRUE  TRUE       2011-09-05
6  b          <NA>          2012  TRUE FALSE       2012-01-01
7  c    2012-11-11          2012 FALSE FALSE       2012-11-11
8  c    2013-05-15          2013 FALSE FALSE       2013-05-15
当我尝试这段特定的代码时,我得到一条错误消息,它是:错误:未使用的参数(如.Date(c(NA,1,NA,2,3,NA,NA,4)),c(1,NA,2,3,NA,NA,4,5))

我搜索了类似的问题,比如“ifelse concatenate date”及其一些变体,但没有找到任何适用于这个特定问题的问题


我对R(和CLIs)非常陌生,所以如果我忽略了一个非常明显的解决方案,我会提前道歉。从Excel到R的转换很有趣,但在执行看似相对简单的任务时往往会很痛苦(尽管dplyr包非常有用)

您的
ifelse
块似乎有问题。您提前关闭了第二个块的括号,没有给出
yes
no
参数,并且为第一个
ifelse
块提供了额外的参数

这应该起作用:

id你可以做什么

tdat$EffectiveDate <- as.Date(tdat$EffectiveDate)

tdat %>% mutate(NewEffectiveDate = as.Date(
    ifelse(!is.na(EffectiveDate), EffectiveDate,
           ifelse(!is.na(EffectiveYear), as.Date(paste(EffectiveYear, 1, 1, sep="-")),
                  lag(EffectiveDate)))
)) -> res

res
#   id EffectiveDate EffectiveYear NewEffectiveDate
# 1  a    1972-10-05          1972       1972-10-05
# 2  a          <NA>          1985       1985-01-01
# 3  a    1988-11-12          1988       1988-11-12
# 4  b    2011-09-05          2011       2011-09-05
# 5  b          <NA>            NA       2011-09-05
# 6  b          <NA>          2012       2012-01-01
# 7  c    2012-11-11          2012       2012-11-11
# 8  c    2013-05-15          2013       2013-05-15
tdat$EffectiveDate%变异(NewEffectiveDate=as.Date(
ifelse(!is.na(生效日期),生效日期,
ifelse(!is.na(EffectiveYear),as.Date(粘贴(EffectiveYear,1,1,sep=“-”)),
滞后(生效日期)))
))->res
物件
#id有效日期有效年份新有效日期
#1 a 1972-10-05 1972-10-05
#2 a 1985-01-01
#3 a 1988-11-12 1988-11-12
#4b 2011-09-05 2011-09-05
#5b北美2011-09-05
#6b 2012-01-01
#7 c 2012-11-11 2012-11-11
#8 c 2013-05-15 2013-05-15

谢谢。这是一个好机会。我认为你建议的代码中也有一个问题。第四行的第三个“)”应移到第五行的末尾,以便正确捕获ifelse语句的参数。但是,当我执行此操作时,会收到不同的错误消息。这一条现在是:错误:“origin”必须被提供需要提供的
origin
是为mutate函数提供的。您需要指定需要在函数中“修改”的原始列。非常感谢。这个解决方案也起了作用。一个快速跟进的问题是:为什么在这个公式中使用花括号?我想没有它们你也会得到相同的答案。@wdf1088删除了它们,它们只是帮助获得了正确的缩进(ess格式)OK。我也这么想。有点离题,但对于这样的代码或一般的编码,是否有标准或首选格式?我已经在我的问题帖中提到了这一点,但我对这一切都是新手,我正试图收集尽可能多的参考资料。我真诚地欢迎您的任何建议,尤其是如果它有助于使我的代码更具可读性的话。@wdf1088至少有一些格式人们似乎在使用。您将看到许多代码带有两个空格缩进(如上面的答案),它们来自RStudio默认格式。4个空格也很常见(像我的一样)来自ESS(emacs)格式。我认为,一般来说,尝试使用有助于可读性的函数,如
tdat %>% mutate(NewEffectiveDate = ifelse(ED_NA == 1 & EY_NA == 0,
  as.Date(paste(EffectiveYear, 1, 1, sep="-")),
  ifelse(ED_NA == 1 & EY_NA == 1), 
  as.Date(lag(EffectiveDate)),
  EffectiveDate
))
tdat %>% mutate(NewEffectiveDate = ifelse(ED_NA == 1 & EY_NA == 0,
  as.Date(paste(EffectiveYear, 1, 1, sep="-")),
  ifelse(ED_NA == 1 & EY_NA == 1, 
  as.Date(lag(EffectiveDate))),
  EffectiveDate))
id <- c("a","a","a","b","b","b","c","c")
EffectiveDate <- c("1972-10-05",NA,"1988-11-12","2011-09-05",NA,NA,"2012-11-11","2013-05-15")
EffectiveYear <- c(1972,1985,1988,2011,NA,2012,2012,2013)
tdat <- data.frame(id, EffectiveDate, EffectiveYear,
                   stringsAsFactors=FALSE)

library(zoo)
tdat %>% 
  mutate(NewEffectiveDate = ifelse(!is.na(EffectiveDate),
                                   EffectiveDate,
                                   ifelse(is.na(EffectiveDate) & !is.na(EffectiveYear),
                                          paste0(EffectiveYear, "-01-01"),
                                          NA)),
         NewEffecitveDate = na.locf(NewEffectiveDate))
tdat$EffectiveDate <- as.Date(tdat$EffectiveDate)

tdat %>% mutate(NewEffectiveDate = as.Date(
    ifelse(!is.na(EffectiveDate), EffectiveDate,
           ifelse(!is.na(EffectiveYear), as.Date(paste(EffectiveYear, 1, 1, sep="-")),
                  lag(EffectiveDate)))
)) -> res

res
#   id EffectiveDate EffectiveYear NewEffectiveDate
# 1  a    1972-10-05          1972       1972-10-05
# 2  a          <NA>          1985       1985-01-01
# 3  a    1988-11-12          1988       1988-11-12
# 4  b    2011-09-05          2011       2011-09-05
# 5  b          <NA>            NA       2011-09-05
# 6  b          <NA>          2012       2012-01-01
# 7  c    2012-11-11          2012       2012-11-11
# 8  c    2013-05-15          2013       2013-05-15