r - 为什么 `select_if(., is_double)` 返回日期?

标签 r dplyr lubridate

当使用 is_double 时与 select_if ,返回值包括 lubridate 的 date 的列数据类型。这是为什么?

这是一个使用 today() 的简单示例功能。

library(tidyverse)
library(lubridate)

mtcars %>% 
    as_tibble() %>% # Convert to tibble
    mutate(today = today()) %>% # Create a date column
    select_if(is_double) # Select double columns

输出:

# A tibble: 32 x 12
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb today     
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <date>    
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4 2020-06-25
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4 2020-06-25
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1 2020-06-25
 4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1 2020-06-25
 5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2 2020-06-25
 6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1 2020-06-25
 7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4 2020-06-25
 8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2 2020-06-25
 9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2 2020-06-25
10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4 2020-06-25
# ... with 22 more rows

希望我错过了一些简单的事情,日期是否被识别为 double 类型?

最佳答案

因为,date在内部存储为double

typeof(today())
#[1] "double"

尽管它的是“Date”

class(today())
#[1] "Date"

一个选项是在 select_if 中添加另一个条件

library(dplyr)
mtcars %>% 
     as_tibble %>%
     mutate(today = today()) %>% 
     select_if(~ is_double(.) && !inherits(., "Date"))
# A tibble: 32 x 10
#     mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb
#   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1  21    160    110  3.9   2.62  16.5     0     1     4     4
# 2  21    160    110  3.9   2.88  17.0     0     1     4     4
# 3  22.8  108     93  3.85  2.32  18.6     1     1     4     1
# 4  21.4  258    110  3.08  3.22  19.4     1     0     3     1
# 5  18.7  360    175  3.15  3.44  17.0     0     0     3     2
# 6  18.1  225    105  2.76  3.46  20.2     1     0     3     1
# 7  14.3  360    245  3.21  3.57  15.8     0     0     3     4
# 8  24.4  147.    62  3.69  3.19  20       1     0     4     2
# 9  22.8  141.    95  3.92  3.15  22.9     1     0     4     2
#10  19.2  168.   123  3.92  3.44  18.3     1     0     4     4
# … with 22 more rows

dplyr 1.0.0中,我们还可以使用whereselect

mtcars %>% 
   as_tibble %>% 
   mutate(today = today()) %>%
   select(where(~is_double(.) && !inherits(., "Date")))

关于r - 为什么 `select_if(., is_double)` 返回日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62583977/

相关文章:

r - 当列同时包含 hms 和 ms 时,lubridate 失败

r - 如何平滑曲线

R:相当于 "Fixed Width Delimitation"?

r - 使用 purrr map2 将 if then 构造转换为嵌套数据中的 case_when

r - 子集 R 中的列表向量

r - 跳过行直到具有特定值的行

r - 使用 R 获得前一年和明年的天数的优雅方法?

r - 将秒转换为持续时间

r - 从完整路径中仅提取文件名之前的文件夹名称

r - 如何在给定特定行顺序的情况下对 R data.table 中的行重新排序