Извлечь класс каждого поля в data.frame;суммировать классы в новом data.frame - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть несколько очень похожих .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_dfr или map_dfc могут работать, но они возвращают ошибки.

Я также попробовал следующее, но раньше я не использовал SumumIze_all и не могу заставить его работать:

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

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Вы можете использовать

lapply(test, function(x) paste0(class(x), collapse = ', ')) %>% data.frame()
0 голосов
/ 23 февраля 2019

Вы очень близки, вам не хватает, что 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

Создано в 2019-02-26 с помощью пакета Представить (v0.2.1)

...