Печать столбцов данных и измененные типы - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть большие таблицы как по длине, так и по ширине для науки о данных. Часто я хочу переместить фрейм данных в таблицу базы данных SQL. Это означает, что я должен записать каждый тип столбца в моем операторе create. Когда столбцы растут> 200, это может быть затруднительно.

Это кажется хорошей возможностью для функции. Я думаю, что он сначала проверит типы столбцов во фрейме данных и вернет соответствующие Postgres типы столбцов, чтобы я мог скопировать и вставить.

R -> Перевод PG12 https://www.postgresql.org/docs/12/datatype-numeric.html


| R class      | PG12 datatype             | Note                                                                                                                 |
|--------------|---------------------------|----------------------------------------------------------------------------------------------------------------------|
| factor, char | text                      | text can handle varying length strings                                                                               |
| integer      | smallint                  | if abs(x) <= 32767 then smallint                                                                                     |
| integer      | integer                   | if abs(x) <= 2147483647 then integer                                                                                 |
| integer      | bigint                    | if abs(x) <= 9223372036854775807 then bigint                                                                         |
| numeric      | smallint, integer, bigint | if there is nothing in the decimal places `4.0` coerce it to integer to save space                                   |
| numeric      | numeric(precision,scale)  | precision = nchar(unlist(strsplit(x = as.character(10.045), split = ".", fixed = T))[2]); scale = max(nchar(10.045)) |
| Date         | date                      |                                                                                                                      |

Например, эта таблица: head(Orange)
code output

даст следующие результаты:
input code

, которые я могу скопировать и вставить в оператор create:
final result

Существуют ли какие-либо решения для этого, которые люди нашли или Может ли кто-нибудь помочь с логи c для этой функции? Заранее спасибо за любую помощь!

1 Ответ

0 голосов
/ 30 апреля 2020

Никто еще не ответил, так что вот функциональное (не оптимальное) решение, которое я разработал.

x <- data.frame(smallint = 0:10, 
                smallint2 = 0.0:10.0,
                integer = 1e6:1.00001e6, 
                bigint1 = 1e11:1.0000000001e11, 
                bigint2 = 1e10:1.000000001e10, 
                bigint3 = 1e9:1.00000001e9, 
                bigint4 = 1e8:1.0000001e8, 
                text1 = LETTERS[1:11], 
                text2 = factor(LETTERS[1:11]), 
                date = as.Date("1985-01-21"),
                timestamp = Sys.time()
                , stringsAsFactors = F)

foo <- function(df){
        col.info <- sapply(X = df, FUN = function(z){RPostgreSQL::dbDataType(dbObj = con, obj = z)})
    print(data.frame(col = row.names(data.frame(col.info)), col.type = paste0(col.info,",")), row.names = F)
}
foo(df = x)
foo(df = Orange)
...