gpt4 book ai didi

r - 如何使用 dplyr 将类 tbl_mysql 的对象转换为 tbl_df?

转载 作者:行者123 更新时间:2023-12-05 01:17:18 26 4
gpt4 key购买 nike

我正在使用以下代码下载一个 mysql 表并将其分配给对象 nycflights

library(dplyr)    
my_db <- src_mysql(dbname = "dplyr",
host = "dplyr.csrrinzqubik.us-east-1.rds.amazonaws.com",
port = 3306,
user = "dplyr",
password = "dplyr")
nycflights <- tbl(my_db, "dplyr")

然后,我想在使用 dplyr 进行计算之前将此对象转换为类 tbl_df 的数据帧。原因是有一些函数不适用于类 tbl_mysql 的表。例如

> nycflights %>%
sample_n(1)
Error: Don't know how to sample from objects of class tbl_mysql

原因是 mysql 数据库中的记录没有内在的顺序,因此不能随机抽样。

回到我的问题,我尝试了 3 种不同的方法:

首先:

> tbl_df(nycflights)
Error: data is not a data frame

第二个:

> as_data_frame(nycflights)
Error: data_frames can only contain 1d atomic vectors and lists

第三,太慢了,过一会儿就崩溃了:

tbl_dt(nycflights)

更新

我问的问题可能实用性很低。在极少数情况下,用户需要collect() 整个数据集。此外,要在 tbl_mysql 对象上获取随机样本,我可以使用以下代码:

nycflights %>% 
mutate(x=rand()) %>%
collapse() %>%
filter(x<=.0001) %>%
select(-x) %>%
collect()

请记住,rand() 是一个实际的 mysql 函数。这一点让我感到困惑,因为我按照此 r studio seminar 中的建议使用了 random()

最佳答案

您可以使用 collect() 来达到这个目的。来自帮助:

collect also forces computation, but will bring data back into an R data.frame (stored in a tbl_df).

运行需要一点时间,但考虑到数据集的大小,我认为这是正常的:

system.time(nycflights_local <- collect(nycflights))
## user system elapsed
## 1.177 0.404 17.839
class(nycflights_local)
## [1] "tbl_df" "tbl" "data.frame"

如果您更喜欢tbl_dt,您可以轻松转换:

nycflights_dt <- tbl_dt(collect(nycflights))
class(nycflights_dt)
## [1] "tbl_dt" "tbl" "data.table" "data.frame"

与 OP 不同,我还可以直接在 nycflights 上使用 tbl_df(),但是生成的 tbl_df 对象被修剪为前 100'000 行:

nycflights_dt2 <- tbl_dt(nycflights)
## Warning message:
## Only first 100,000 results retrieved. Use n = -1 to retrieve all.

有了nycflights_local,你可以使用sample_n():

sample_n(nycflights_local, 5) %>% select(id:day)
## Source: local data frame [5 x 4]
##
## id year month day
## (int) (int) (int) (int)
## 1 89847 2013 12 8
## 2 18669 2013 1 22
## 3 70178 2013 11 16
## 4 219012 2013 5 28
## 5 144250 2013 3 9

关于r - 如何使用 dplyr 将类 tbl_mysql 的对象转换为 tbl_df?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36670191/

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