gpt4 book ai didi

r - 基于现有数据帧为 read_csv 创建 col_types 字符串规范

转载 作者:行者123 更新时间:2023-12-04 18:55:46 25 4
gpt4 key购买 nike

我有一个 data.frame 或 tibble,它在一个脚本中写入 CSV 文件。在另一个脚本中,相同的 CSV 文件被读入 data.frame 或 tibble。使用 read_csv() , 与 col_types=参数,我可以指定要读入的列类型。这是一个例子:

# Create an example dataframe
df <- tibble::tibble(a=1L
, b=1.0
, c="a"
, d=TRUE
, e=lubridate::ymd_hms("2019-03-19T13:15:18Z")
, f=lubridate::ymd("2019-03-19")
, g=factor("a"))

# Write csv to file
readr::write_csv(df, "temp.csv")

# read it back in, supplying a col_types string spec
readr::read_csv("temp.csv", col_types="idclTDf")
#> # A tibble: 1 x 7
#> a b c d e f g
#> <int> <dbl> <chr> <lgl> <dttm> <date> <fct>
#> 1 1 1 a TRUE 2019-03-19 13:15:18 2019-03-19 a

创建于 2019-03-19 由 reprex package (v0.2.1)

问题是我需要知道 col_types= read_csv() 上的参数函数(或者让它猜测,我不想这样做)。我想要的是某种方式来获取原始 df并且,在我写出来之前,生成 col_types来自 df 的字符串可用于重新读取转储的 CSV 的对象。也就是说,我想要一些可以创建 "idclTDf" 的对象。字符串给定 data.frame 作为参数。

我看到这里有一个功能请求(我已经添加了我的两分钱): https://github.com/tidyverse/readr/issues/895 .

最佳答案

我确实有一个解决方案,它有效,但我认为它非常不完整且没有强化。这是我对解决方案的尝试。

# https://github.com/tidyverse/readr/issues/895
# Create function to take a tibble and return a character string that can be used in `readr::read_csv()`
# as the `col_types` argument to re-read this back into a dataframe after it had been written out
# by `write_csv()`.

get_col_types_short <- function(.df) {
# Get column classes from input dataframe
lst_col_classes__ <- purrr::map(.df, ~ class(.x))

# Map classes to known single-character col_types indicator
vl_col_class_char__ <- purrr::map_chr(lst_col_classes__, function(.e) {
dplyr::case_when(
"logical" %in% .e ~ "l"
, "integer" %in% .e ~ "i"
, "numeric" %in% .e ~ "d"
, "double" %in% .e ~ "d"
, "character" %in% .e ~ "c"
, "factor" %in% .e ~ "f"
, "Date" %in% .e ~ "D"
, "POSIXct" %in% .e ~ "T"
, TRUE ~ "c"
)
})

# Return vector of single-character col_type indicator.
# Element name is the source column it came from.
vl_col_class_char__
}

# Test it:
df <- tibble::tibble(a=1L
, b=1.0
, c="a"
, d=TRUE
, e=lubridate::ymd_hms("2019-03-19T13:15:18Z")
, f=lubridate::ymd("2019-03-19")
, g=factor("a"))

v__ <- get_col_types_short(df)

# Show what is actually returned
v__
#> a b c d e f g
#> "i" "d" "c" "l" "T" "D" "f"

# Collapse it to show how to use it
paste(v__, collapse="")
#> [1] "idclTDf"


# Write csv to file
readr::write_csv(df, "temp.csv")

# read it back in, using the above col_types string spec
readr::read_csv("temp.csv", col_types=paste(v__, collapse=""))
#> # A tibble: 1 x 7
#> a b c d e f g
#> <int> <dbl> <chr> <lgl> <dttm> <date> <fct>
#> 1 1 1 a TRUE 2019-03-19 13:15:18 2019-03-19 a

创建于 2019-03-19 由 reprex package (v0.2.1)

关于r - 基于现有数据帧为 read_csv 创建 col_types 字符串规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55249599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com