如何在不手动输入 R 的情况下为多列的 sqlSave() 指定 vartype?
How to specify vartype for sqlSave() for multiple columns without manually typing in R?
一些可重现的代码。请注意,您的数据库和服务器名称可能不同。
library(RODBC)
iris <- iris
connection <- odbcDriverConnect(
"Driver={SQL Server};
Server=localhost\SQLEXPRESS;
Database=testdb;
Trusted_connection=true;"
)
# create table in sql and move dataframe values in
columnTypes <- list(
Sepal.Length="decimal(28,0)",
Sepal.Width="decimal(28,0)",
Petal.Length ="decimal(28,0)",
Petal.Width ="decimal(28,0)",
Species = "varchar(255)"
)
sqlSave(connection,iris,varTypes = columnTypes)
这就是我将数据框作为 table 导出到 sql 管理工作室的方式,它有效,但是,假设我在 iris 中有一百个新列。我是否必须在我的 columnTypes 变量中指定每个列名 = 到 decimal(28,0)?
# but what if i have
iris$random1 <- rnorm(150)
iris$random2 <- rnorm(150)
iris$random3-999 ..... <- rnorm(150) ....
iris$random1000 <- rnorm(150)
默认情况下,列至少在我的实际数据框中以浮动形式进入(iris 只是示例),所以这就是为什么我需要在 columnTypes 中手动更改它们。我希望 iris 中 5 个原始列之后的所有内容都是 decimal(28,0) 格式,而不需要手动将它们包含在 columnTypes 中。
我没有阅读 sqlSave() 语句和可能的替代方法。含义:可能有更合适的解决方案。无论如何,您可以通过重复和组合列表在 base R 中生成所需定义的列表:
# dummy data
df <- data.frame(Sepal.Lengt = 1:5,Sepal.Width = 1:5,Petal.Length = 1:5,Petal.Width = 1:5,Species = 1:5,col6 = 1:5,col7 = 1:5)
# all column names after the 5th -> if less then 6 columns you will get an error here!
vec <- names(df)[6:ncol(df)]
# generate list with same definition for all columns after the 5th
list_after_5 <- as.list(rep("decimal(28,0)", length(vec)))
# name the list items acording to the columns after the 5th
names(list_after_5) <- vec
# frist 5 column definitions manualy plus remaining columns with same definition from list generate above
columnTypes <- c(list(Sepal.Length="decimal(28,0)",
Sepal.Width="decimal(28,0)",
Petal.Length ="decimal(28,0)",
Petal.Width ="decimal(28,0)",
Species = "varchar(255)"),
list_after_5)
columnTypes
$Sepal.Length
[1] "decimal(28,0)"
$Sepal.Width
[1] "decimal(28,0)"
$Petal.Length
[1] "decimal(28,0)"
$Petal.Width
[1] "decimal(28,0)"
$Species
[1] "varchar(255)"
$col6
[1] "decimal(28,0)"
$col7
[1] "decimal(28,0)"
由于您的示例代码似乎对您有用,这也应该如此(根据输出判断)- 我没有使用数据库对其进行测试,因为我没有可用的 atm 测试设置。
一些可重现的代码。请注意,您的数据库和服务器名称可能不同。
library(RODBC)
iris <- iris
connection <- odbcDriverConnect(
"Driver={SQL Server};
Server=localhost\SQLEXPRESS;
Database=testdb;
Trusted_connection=true;"
)
# create table in sql and move dataframe values in
columnTypes <- list(
Sepal.Length="decimal(28,0)",
Sepal.Width="decimal(28,0)",
Petal.Length ="decimal(28,0)",
Petal.Width ="decimal(28,0)",
Species = "varchar(255)"
)
sqlSave(connection,iris,varTypes = columnTypes)
这就是我将数据框作为 table 导出到 sql 管理工作室的方式,它有效,但是,假设我在 iris 中有一百个新列。我是否必须在我的 columnTypes 变量中指定每个列名 = 到 decimal(28,0)?
# but what if i have
iris$random1 <- rnorm(150)
iris$random2 <- rnorm(150)
iris$random3-999 ..... <- rnorm(150) ....
iris$random1000 <- rnorm(150)
默认情况下,列至少在我的实际数据框中以浮动形式进入(iris 只是示例),所以这就是为什么我需要在 columnTypes 中手动更改它们。我希望 iris 中 5 个原始列之后的所有内容都是 decimal(28,0) 格式,而不需要手动将它们包含在 columnTypes 中。
我没有阅读 sqlSave() 语句和可能的替代方法。含义:可能有更合适的解决方案。无论如何,您可以通过重复和组合列表在 base R 中生成所需定义的列表:
# dummy data
df <- data.frame(Sepal.Lengt = 1:5,Sepal.Width = 1:5,Petal.Length = 1:5,Petal.Width = 1:5,Species = 1:5,col6 = 1:5,col7 = 1:5)
# all column names after the 5th -> if less then 6 columns you will get an error here!
vec <- names(df)[6:ncol(df)]
# generate list with same definition for all columns after the 5th
list_after_5 <- as.list(rep("decimal(28,0)", length(vec)))
# name the list items acording to the columns after the 5th
names(list_after_5) <- vec
# frist 5 column definitions manualy plus remaining columns with same definition from list generate above
columnTypes <- c(list(Sepal.Length="decimal(28,0)",
Sepal.Width="decimal(28,0)",
Petal.Length ="decimal(28,0)",
Petal.Width ="decimal(28,0)",
Species = "varchar(255)"),
list_after_5)
columnTypes
$Sepal.Length
[1] "decimal(28,0)"
$Sepal.Width
[1] "decimal(28,0)"
$Petal.Length
[1] "decimal(28,0)"
$Petal.Width
[1] "decimal(28,0)"
$Species
[1] "varchar(255)"
$col6
[1] "decimal(28,0)"
$col7
[1] "decimal(28,0)"
由于您的示例代码似乎对您有用,这也应该如此(根据输出判断)- 我没有使用数据库对其进行测试,因为我没有可用的 atm 测试设置。