r语言 - 在数字列名称上筛选非 NA



我正在尝试使用as.Date变量过滤包含数字/日期名称的列。

例如,请考虑以下小型数据库:

dt <- data.table(
names = c("A", "B", "C"),
`2020-01-01` = c(1, NA, 2),
`2020-01-02` = c(3, 4, 5),
`2020-01-03` = c(6, 7, 8)
)

我目前正在过滤所需的日期列,如下所示:

dt1 <- dt %>% filter(!is.na(`2020-01-01`)) %>% select(names)

我的想法是创建一个meeting_date变量,这个变量应该用作我所有 R 代码的日期参考。

meeting_date <- as.Date("2020-01-01")

但当然是代码:

dt1 <- dt %>% filter(!is.na(meeting_date)) %>% select(names)

不工作。原因是缺少反引号,因此我没有成功,我尝试了以下代码:

dt1 <- dt %>% filter(!is.na(paste("`", meeting_date, "`", sep=""))) %>% select(names)
dt1 <- dt %>% filter(!is.na(noquote(paste("`", meeting_date, "`", sep="")))) %>% select(names)

有谁知道如何进行?谢谢!

你可以做:

meeting_date <- as.Date("2020-01-01")
dt %>%
filter_at(vars(one_of(as.character(meeting_date))), ~ !is.na(.))
names 2020-01-01 2020-01-02 2020-01-03
1     A          1          3          6
2     C          2          5          8

长数据应该更容易处理:

library(data.table)
dt <- data.table(
names = c("A", "B", "C"),
`2020-01-01` = c(1, NA, 2),
`2020-01-02` = c(3, 4, 5),
`2020-01-03` = c(6, 7, 8)
)
#Make data 'long' & change the new 'name' column to dates
# change confusing column 'name' to date while we're at it.
dt_long <- dt %>% pivot_longer(-names) %>% 
mutate(date = lubridate::ymd(name)) %>%
select(-name)
meeting_date <- as.Date("2020-01-01")
dt_long %>% filter(date == meeting_date & (!is.na(value)))

您可以使用subset+is.na

如下所示
meeting_date <- "2020-01-01"
dtout <- subset(dt,as.vector(!is.na(dt[, ..meeting_date])))

这样

> dtout
names 2020-01-01 2020-01-02 2020-01-03
1:     A          1          3          6
2:     C          2          5          8