提取data.frame中每个字段的class;在新 data.frame 中总结 classes

Extract class of each field in data.frame; summarize classes in new data.frame

我有许多非常相似的 .csv,我想以编程方式检查它们以确定它们的列类型是否相同。

假设我已经将 .csv 导入为 data.frame 并且我想检查列 classes:

library(tidyverse)

test <- structure(list(Date = "6/15/2018", Time = structure(44255, class = c("hms", 
"difftime"), units = "secs")), row.names = c(NA, -1L), class = c("tbl_df", 
"tbl", "data.frame"))

test
## A tibble: 1 x 2
#  Date      Time  
#  <chr>     <time>
#1 6/15/2018 12:17 

检查每一列的class,我可以看到Time列有两个class:

map(test, class)
# $`Date`
# [1] "character"

# $Time
# [1] "hms"      "difftime"

我想要的是 data.frame 理想情况下会显示:

Date       Time
character  hms, difftime

这样我就可以轻松地比较不同的 csvs。

我认为 map_dfrmap_dfc 可能有效,但它们 return 错误。

我也尝试了以下方法,但我以前没有使用过 summarize_all,我无法让它工作:

test %>% data.frame() %>% 
  summarize_all(funs(paste0(collapse = ", ")))

您非常接近,您错过了 funs() 要求您指定列向量在使用 . 的函数调用中的位置。所以它会是:

test %>%
  summarize_all(funs(paste0(class(.), collapse = ", ")))

但是,从 dplyr 0.8.0 开始,funs() 已被软弃用并发出警告。相反,您可以使用这样的公式表示法:

library(tidyverse)
test <- structure(list(Date = "6/15/2018", Time = structure(44255, class = c("hms", "difftime"), units = "secs")), row.names = c(NA, -1L), class = c("tbl_df", "tbl", "data.frame"))
test %>%
  summarise_all(~ class(.) %>% str_c(collapse = ", "))
#> # A tibble: 1 x 2
#>   Date      Time         
#>   <chr>     <chr>        
#> 1 character hms, difftime

如果您想尝试使用 purrr 风格的语法,这里有一种方法可以在一行中使用 imap_dfr 以长格式获取它。我们将函数写入 return 每列的命名向量,然后使用 _dfr 绑定到数据帧中。 (您也可以使用 gather 重塑宽幅版本)

test %>%
  imap_dfr(~ tibble(colname = .y, classes = class(.x) %>% str_c(collapse = ", ")))
#> # A tibble: 2 x 2
#>   colname classes      
#>   <chr>   <chr>        
#> 1 Date    character    
#> 2 Time    hms, difftime

reprex package (v0.2.1)

创建于 2019-02-26

您可以使用

lapply(test, function(x) paste0(class(x), collapse = ', ')) %>% data.frame()