r-如何循环ifelse命令



我有一个数据帧,表示一个财政季度的开始(dtime_b(和结束(dtime(,以及公司成员(m1-m3(的列表以及他们第一次加入公司的时间。注意,日期格式是";YYYY-MM-DD";。数据帧如下所示:

df <- data.frame(dtime = c("2014-12-31", "2015-03-31", "2015-06-30", "2015-09-30"),
dtime_b = c("2014-09-30", "2014-12-31", "2015-03-31", "2015-06-30"),
m1 = c("2014-10-04", "2014-10-04", "2020-02-19", "2020-02-19"),
m2 = c("2015-1-14", "2017-11-14", "2017-11-14", "2017-11-14"),
m3 = c("2013-11-14", "2013-11-14", "2013-11-14", "2013-11-14")
)

如果m1-m3列发生了更改,则意味着替换了一个成员。我的目标是创建总共三个假人,如果成员加入公司的日期介于该行的dtime_b和dtime之间,则每个假人都是一个假人。

为此,我编写了以下代码:

df$dummy_m1 <- ifelse(df$m1 <= df$dtime & df$m1 > df$dtime_b, 1, 0)
df$dummy_m1[is.na(df$dummy_m1)] <- 0
df$dummy_m2 <- ifelse(df$m2 <= df$dtime & df$m2 > df$dtime_b, 1, 0)
df$dummy_m2[is.na(df$dummy_m2)] <- 0
df$dummy_m3 <- ifelse(df$m3 <= df$dtime & df$m3 > df$dtime_b, 1, 0)
df$dummy_m3[is.na(df$dummy_m3)] <- 0

虽然这个代码有效,但我有很多这样的成员,把他们都写出来会让我有很多错误的可能性。我非常感谢你在减少这个代码方面的帮助!

dplyr:使用across

library(dplyr)
df %>% 
mutate(across(m1:m3, ~ ifelse(.x <= dtime & .x > dtime_b, 1, 0),
.names = "dummy_{col}"))

输出

dtime    dtime_b         m1         m2         m3 dummy_m1 dummy_m2 dummy_m3
1 2014-12-31 2014-09-30 2014-10-04  2015-1-14 2013-11-14        1        0        0
2 2015-03-31 2014-12-31 2014-10-04 2017-11-14 2013-11-14        0        0        0
3 2015-06-30 2015-03-31 2020-02-19 2017-11-14 2013-11-14        0        0        0
4 2015-09-30 2015-06-30 2020-02-19 2017-11-14 2013-11-14        0        0        0

最新更新