【问题标题】:Filter non-NAs on numeric column name在数字列名称上过滤非 NA
【发布时间】:2020-01-03 10:47:17
【问题描述】:

我正在尝试使用 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)

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

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    你可以这样做:

    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
    

    【讨论】:

      【解决方案2】:

      长数据应该更容易处理:

      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)))
      

      【讨论】:

        【解决方案3】:

        您可以使用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
        

        【讨论】:

          猜你喜欢
          • 2021-11-07
          • 2021-02-02
          • 1970-01-01
          • 2022-10-13
          • 2022-07-20
          • 2014-01-23
          • 2023-03-14
          • 1970-01-01
          相关资源
          最近更新 更多