我想通过编程检查许多非常相似的.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
可能有用,但它们返回错误。
我也尝试了以下方法,但是之前我没有使用过summary_all,因此无法正常工作:
test %>% data.frame() %>%
summarize_all(funs(paste0(collapse = ", ")))
答案 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()