我正在處理這樣的資料集
Id Col1 Date FromDate ToDate Weight
1 Blue 2018 NA NA 24.9
2 Green 2018 NA NA 14.5
3 Red 2010 2009-05-15 2015-09-15 87.5
3 Red 2010 2015-10-15 2020-08-15 43.8
4 Yellow 2020 2019-10-15 2021-05-15 29.5
5 Purple 2011 NA NA NA
我喜歡在 From 和 To Date 列中保留 NA 的行,因為沒有什么可以比較 Date 列中的 Date 值和
如果 From 和 To Date 沒有丟失,則只保留那些 Date 值介于 From 和 To Date 之間的日期。
根據邏輯,預期的資料集將是這樣的
Id Col1 Date FromDate ToDate Weight
1 Blue 2018 NA NA 24.9
2 Green 2018 NA NA 14.5
3 Red 2010 2009-05-15 2015-09-15 87.5
4 Yellow 2020 2019-10-15 2021-05-15 29.5
5 Purple 2011 NA NA NA
我知道我可以使用該filter功能,但我不確定如何使其與未排除的 NA 值一起使用。任何建議都非常感謝。
uj5u.com熱心網友回復:
你應該能夠這樣做:
df <- tribble(
~Date, ~From, ~To,
2018, NA, NA,
2010, "2009-05-09", "2015-09-15"
)
df %>% filter(
# Condition 1
(is.na(From) & is.na(To)) |
# Condition 2
((Date > year(From))) &
(Date < year(To))))
)
uj5u.com熱心網友回復:
這是另一個解決方案,它利用了{lubridate}包。
library(tidyverse)
library(lubridate)
#>
#> Attaching package: 'lubridate'
#> The following objects are masked from 'package:base':
#>
#> date, intersect, setdiff, union
dates <- tibble::tribble(
~Id, ~Col1, ~Date, ~FromDate, ~ToDate, ~Weight,
1L, "Blue", 2018L, NA, NA, 24.9,
2L, "Green", 2018L, NA, NA, 14.5,
3L, "Red", 2010L, "2009-05-15", "2015-09-15", 87.5,
3L, "Red", 2010L, "2015-10-15", "2020-08-15", 43.8,
4L, "Yellow", 2020L, "2019-10-15", "2021-05-15", 29.5,
5L, "Purple", 2011L, NA, NA, NA
)
dates %>%
mutate(FromDate = lubridate::ymd(FromDate),
ToDate = lubridate::ymd(ToDate),
Date = lubridate::ymd(Date, truncated = 2L),
Interval = lubridate::interval(ymd(FromDate), ymd(ToDate))) %>%
filter( ((Date %within% Interval) == TRUE) | (is.na(FromDate) & is.na(ToDate))) %>%
select(-Interval)
#> # A tibble: 5 × 6
#> Id Col1 Date FromDate ToDate Weight
#> <int> <chr> <date> <date> <date> <dbl>
#> 1 1 Blue 2018-01-01 NA NA 24.9
#> 2 2 Green 2018-01-01 NA NA 14.5
#> 3 3 Red 2010-01-01 2009-05-15 2015-09-15 87.5
#> 4 4 Yellow 2020-01-01 2019-10-15 2021-05-15 29.5
#> 5 5 Purple 2011-01-01 NA NA NA
由reprex 包(v2.0.1)于 2021 年 10 月 11 日創建
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/313675.html
