R 在连接日期变量的元素时使用ifelse语句
我试图使用两个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-
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