我有一個 data.table,其中包含每個人的進入和退出日期以及一個指示退出原因的文本列。我的資料如下所示:
dt <- data.table (ID = c(1,2,3,4,5),
entry = c("01/01/2010", "01/02/2016", "01/05/2010", "01/09/2013", "01/01/2010"),
exit = c("31/12/2010", "01/01/2021", "30/09/2010", "31/12/2015", "30/09/2010"),
text = c("a", NA, "c", NA, "b"),
result_2010 = c(NA, NA, NA, NA,NA))
ID entry exit text result_2010
1: 1 01/01/2010 31/12/2010 a NA
2: 2 01/02/2016 01/01/2021 <NA> NA
3: 3 01/05/2010 30/09/2010 c NA
4: 4 01/09/2013 31/12/2015 <NA> NA
5: 5 01/01/2010 30/09/2010 b NA
在“result_2010”列中,我想確定此人是否在 2010 年 1 月 1 日至 2010 年 12 月 31 日之間離開公司,但前提是在“文本”列中該人有“a”或“c”。否則結果應回傳“false”。
結果應該是這樣的:
ID entry exit text result_2010
1: 1 01/01/2010 31/12/2010 a TRUE
2: 2 01/02/2016 01/01/2021 <NA> FALSE
3: 3 01/05/2010 30/09/2010 c TRUE
4: 4 01/09/2013 31/12/2015 <NA> FALSE
5: 5 01/01/2010 30/09/2010 b FALSE
有誰知道我怎么能做到這一點?
uj5u.com熱心網友回復:
資料表
dt[, c("entry","exit") := lapply(.SD, as.Date, format = "%d/%m/%Y"), .SDcols = c("entry","exit")]
dt[, result_2010 := text %in% c("a", "c") & between(exit, as.Date("2010-01-01"), as.Date("2010-12-31"))]
# ID entry exit text result_2010
# <num> <Date> <Date> <char> <lgcl>
# 1: 1 2010-01-01 2010-12-31 a TRUE
# 2: 2 2016-02-01 2021-01-01 <NA> FALSE
# 3: 3 2010-05-01 2010-09-30 c TRUE
# 4: 4 2013-09-01 2015-12-31 <NA> FALSE
# 5: 5 2010-01-01 2010-09-30 b FALSE
(實際上是另一個答案的一個data.table版本,并且都受益于or的可讀性。)data.table::betweendplyr::between
uj5u.com熱心網友回復:
我們可以將列轉換為Date類,并根據 OP 帖子中的條件創建一個邏輯列
library(dplyr)
library(lubridate)
dt %>%
mutate(across(c(entry, exit), dmy)) %>%
mutate(result_2010 = entry >= as.Date('2010-01-01') &
exit <= as.Date("2010-12-31") & text %in% c("a", "c"))
-輸出
ID entry exit text result_2010
1: 1 2010-01-01 2010-12-31 a TRUE
2: 2 2016-02-01 2021-01-01 <NA> FALSE
3: 3 2010-05-01 2010-09-30 c TRUE
4: 4 2013-09-01 2015-12-31 <NA> FALSE
5: 5 2010-01-01 2010-09-30 b FALSE
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/316369.html
