提取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_dfr
或 map_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()
我有许多非常相似的 .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_dfr
或 map_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()