通过 sqlQuery() 删除重复列
Remove Duplicate Columns via sqlQuery()
我正在使用 R 编程语言。假设我有以下数据框:
age=18:29
height=c(76.1,77,78.1,78.2,78.8,79.7,79.9,81.1,81.2,81.8,82.8,83.5)
gender=c("M","F","M","M","F","F","M","M","F","M","F","M")
testframe = data.frame(age=age,height=height,height2=height,gender=gender,gender2=gender)
head(testframe)
age height height2 gender gender2
1 18 76.1 76.1 M M
2 19 77.0 77.0 F F
3 20 78.1 78.1 M M
4 21 78.2 78.2 M M
5 22 78.8 78.8 F F
6 23 79.7 79.7 F F
如果我想删除名称不同但值相同的列,我可以使用以下代码行:
no_dup = testframe[!duplicated(as.list(testframe))]
head(no_dup)
age height gender
1 18 76.1 M
2 19 77.0 F
3 20 78.1 M
4 21 78.2 M
5 22 78.8 F
6 23 79.7 F
我的问题:假设数据框不在全局环境中——是否可以通过sqlQuery()
命令传递上述代码行?例如:
library(RODBC)
library(sqldf)
con = odbcConnect("some name", uid = "some id", pwd = "abc")
#not sure if this is correct?
sample_query = sqlQuery(con, "testframe[!duplicated(as.list(testframe))]")
有人可以告诉我怎么做吗?
谢谢!
这 SQL 端 的所有实质性处理,仅在 R 端进行名称操作。数据库没有下载到 R.
第一个管道输入名称(我们已将名称硬编码在名称中,但如有必要,您可以从数据库中检索它们)和 returns 一个 SQL 语句,sql 1,当 运行 针对您的数据库时,将从数据库中生成一个单行数据框,该数据框为 testframe 中的每对变量都有一列,其值为不相等值的数量。
然后我们 运行 sql1 使用 sqldf 来实现可重复性,但您可以将其替换为对 sqlQuery 的适当调用。
第二个管道然后使用 numDF 在字符向量 sql2 中生成一个或多个 SQL 语句以删除重复的列,即那些有零个不等值的列然后您可以 运行 那些 SQL 对你的数据库的语句。
我们将 sqldf 与 SQLite 一起使用以实现可重复性,但您可以将对 sqldf 的调用替换为对 sqlQuery 的适当修改调用,例如sqlQuery(con, sql1) 其中 con 是您之前定义的连接。
您使用的任何数据库系统都可能接受相同的 SQL,但如果不是,则可能需要对代码进行小的更改以生成您正在使用的任何数据库系统都接受的 SQL .
library(magrittr)
library(sqldf)
Names <- c("age", "height", "height2", "gender", "gender2")
sql1 <- Names %>%
{ toString(sprintf("sum(%s)", combn(., 2, paste, collapse = "!="))) } %>%
paste("select", ., "from testframe")
numDF <- sqldf(sq11) # replace with call to your database
sql2 <- numDF %>%
Filter(Negate(c), .) %>%
names %>%
sub(".*!=(.*.).", "alter table testframe drop \1", .)
# Just run the sql2 part against your db, not select * ... part.
# The select * ... downloads table for demo purposes only.
sqldf(c(sql2, "select * from testframe")) # replace
## age height gender
## 1 18 76.1 M
## 2 19 77.0 F
## 3 20 78.1 M
## 4 21 78.2 M
## ...snip...
注意下面是sql1和sql2。 sql1 是单个 sql select 语句,sql2 是 sql alter 语句的向量,每列删除一个语句。如果您的数据库允许 ALTER 一次删除多列,您也许可以简化它,但 SQLite 一次只允许一个。
sql1
## [1] "select sum(age!=height), sum(age!=height2), sum(age!=gender), sum(age!=gender2), sum(height!=height2), sum(height!=gender), sum(height!=gender2), sum(height2!=gender), sum(height2!=gender2), sum(gender!=gender2) from testframe"
sql2
## [1] "alter table testframe drop height2" "alter table testframe drop gender2"
我正在使用 R 编程语言。假设我有以下数据框:
age=18:29
height=c(76.1,77,78.1,78.2,78.8,79.7,79.9,81.1,81.2,81.8,82.8,83.5)
gender=c("M","F","M","M","F","F","M","M","F","M","F","M")
testframe = data.frame(age=age,height=height,height2=height,gender=gender,gender2=gender)
head(testframe)
age height height2 gender gender2
1 18 76.1 76.1 M M
2 19 77.0 77.0 F F
3 20 78.1 78.1 M M
4 21 78.2 78.2 M M
5 22 78.8 78.8 F F
6 23 79.7 79.7 F F
如果我想删除名称不同但值相同的列,我可以使用以下代码行:
no_dup = testframe[!duplicated(as.list(testframe))]
head(no_dup)
age height gender
1 18 76.1 M
2 19 77.0 F
3 20 78.1 M
4 21 78.2 M
5 22 78.8 F
6 23 79.7 F
我的问题:假设数据框不在全局环境中——是否可以通过sqlQuery()
命令传递上述代码行?例如:
library(RODBC)
library(sqldf)
con = odbcConnect("some name", uid = "some id", pwd = "abc")
#not sure if this is correct?
sample_query = sqlQuery(con, "testframe[!duplicated(as.list(testframe))]")
有人可以告诉我怎么做吗?
谢谢!
这 SQL 端 的所有实质性处理,仅在 R 端进行名称操作。数据库没有下载到 R.
第一个管道输入名称(我们已将名称硬编码在名称中,但如有必要,您可以从数据库中检索它们)和 returns 一个 SQL 语句,sql 1,当 运行 针对您的数据库时,将从数据库中生成一个单行数据框,该数据框为 testframe 中的每对变量都有一列,其值为不相等值的数量。
然后我们 运行 sql1 使用 sqldf 来实现可重复性,但您可以将其替换为对 sqlQuery 的适当调用。
第二个管道然后使用 numDF 在字符向量 sql2 中生成一个或多个 SQL 语句以删除重复的列,即那些有零个不等值的列然后您可以 运行 那些 SQL 对你的数据库的语句。
我们将 sqldf 与 SQLite 一起使用以实现可重复性,但您可以将对 sqldf 的调用替换为对 sqlQuery 的适当修改调用,例如sqlQuery(con, sql1) 其中 con 是您之前定义的连接。
您使用的任何数据库系统都可能接受相同的 SQL,但如果不是,则可能需要对代码进行小的更改以生成您正在使用的任何数据库系统都接受的 SQL .
library(magrittr)
library(sqldf)
Names <- c("age", "height", "height2", "gender", "gender2")
sql1 <- Names %>%
{ toString(sprintf("sum(%s)", combn(., 2, paste, collapse = "!="))) } %>%
paste("select", ., "from testframe")
numDF <- sqldf(sq11) # replace with call to your database
sql2 <- numDF %>%
Filter(Negate(c), .) %>%
names %>%
sub(".*!=(.*.).", "alter table testframe drop \1", .)
# Just run the sql2 part against your db, not select * ... part.
# The select * ... downloads table for demo purposes only.
sqldf(c(sql2, "select * from testframe")) # replace
## age height gender
## 1 18 76.1 M
## 2 19 77.0 F
## 3 20 78.1 M
## 4 21 78.2 M
## ...snip...
注意下面是sql1和sql2。 sql1 是单个 sql select 语句,sql2 是 sql alter 语句的向量,每列删除一个语句。如果您的数据库允许 ALTER 一次删除多列,您也许可以简化它,但 SQLite 一次只允许一个。
sql1
## [1] "select sum(age!=height), sum(age!=height2), sum(age!=gender), sum(age!=gender2), sum(height!=height2), sum(height!=gender), sum(height!=gender2), sum(height2!=gender), sum(height2!=gender2), sum(gender!=gender2) from testframe"
sql2
## [1] "alter table testframe drop height2" "alter table testframe drop gender2"