提取data.frame中每个字段的类;在新的data.frame中汇总类

时间:2019-02-22 21:10:37

标签: r dplyr purrr summarize

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

说我已将.csv导入为data.frame,我想检查列类:

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 

检查每列的类,可以看到Time列有两个类:

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

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

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

Date       Time
character  hms, difftime

以便我可以轻松地在不同的csvs之间进行比较。

我认为map_dfrmap_dfc可能有用,但它们返回错误。

我也尝试了以下方法,但是之前我没有使用过summary_all,因此无法正常工作:

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

2 个答案:

答案 0 :(得分:2)

您非常接近,您错过了funs()要求您指定要使用.进行的函数调用中列向量的位置的信息。这样就可以了:

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

但是,funs()已过时,并且自dplyr 0.8.0起发出警告。相反,您可以使用以下公式表示法:

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以长格式获取它的一种方法。我们编写函数以为每一列返回一个命名向量,然后使用_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创建

答案 1 :(得分:1)

您可以使用

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