【问题标题】:Using a list of IDs to combine SQL tables into a data frame in R使用 ID 列表将 SQL 表组合成 R 中的数据框
【发布时间】:2021-04-26 18:00:57
【问题描述】:

我有一个与任何实际数据无关的 ID 列表。我有一个 SQL 数据库,其中每个 ID 都有一个表,这些表中的数据我想根据我拥有的 ID 列表将它们组合成一个大数据框。我认为为此需要一个 for 循环,但我无法让它正常工作。

例如,我有一个 ID 列表” 1,2,3,4,5

我有一个 SQL 数据库,其中每个都有表,它们还有与 ID 相关联的其他数据。每个 ID 都有多行多列。

我希望我的最终产品是这些行和列的组合,以便 ID 列表位于 r 中的单个数据框中。我怎么能这样做?最有效的方法是什么?

#Example data set
library(lubridate)
date <- rep_len(seq(dmy("26-12-2010"), dmy("20-12-2011"), by = "days"), 500)
ID <- rep(seq(1, 5), 100)

df <- data.frame(date = date,
                 x = runif(length(date), min = 60000, max = 80000),
                 y = runif(length(date), min = 800000, max = 900000),
                 ID)

for (i in 1: length(ID)){
  ID[i] <- dbReadTable(mydb, ID[i])
}

非常感谢您的宝贵时间。

【问题讨论】:

  • 你的意思是你的 SQL 数据库中有一个名为1的表?
  • 是的,我对数据库中的每个 ID 都有一个表,我想将它们读入 R 并将它们组合成一个数据框。
  • IDs &lt;- lapply(ID, function(i) dbReadTable(mydb, i)) 应该给你一个表格列表。这就是你所追求的吗?

标签: sql r sqlite for-loop rsqlite


【解决方案1】:

我将扩展我的评论以完成问题。

IDs <- lapply(setNames(nm=ID), function(i) dbReadTable(mydb, i)) 

然后是以下之一:

## base R
IDs <- Map(function(x, nm) transform(x, id = nm), IDs, names(IDs))
DF <- do.call(rbind, IDs)

## dplyr
DF <- dplyr::bind_rows(IDs, .id = "id")

## data.table
DF <- data.table::rbindlist(IDs, idcol = "id")

添加"id" 列是为了根据源ID 轻松区分行。如果表中已包含该参数,则可以省略 Map(基数)和 .id/idcol 参数。

(顺便说一句,这假设所有表都具有相同的确切结构:相同的列名和相同的数据类型。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    相关资源
    最近更新 更多