来自这样的数据框架
test <- data.frame('id'= rep(1:5,2), 'string'= LETTERS[1:10])
test <- test[order(test$id), ]
rownames(test) <- 1:10
> test
id string
1 1 A
2 1 F
3 2 B
4 2 G
5 3 C
6 3 H
7 4 D
8 4 I
9 5 E
10 5 J
Run Code Online (Sandbox Code Playgroud)
我想用每个id/string对的第一行创建一个新的.如果sqldf在其中接受R代码,则查询可能如下所示:
res <- sqldf("select id, min(rownames(test)), string
from test
group by id, string")
> res
id string
1 1 A
3 2 B
5 3 C
7 4 D
9 5 E …Run Code Online (Sandbox Code Playgroud) 我将以一个例子来说明我的问题.
样本数据:
df <- data.frame(ID = c(1, 1, 2, 2, 3, 5), A = c("foo", "bar", "foo", "foo", "bar", "bar"), B = c(1, 5, 7, 23, 54, 202))
df
ID A B
1 1 foo 1
2 1 bar 5
3 2 foo 7
4 2 foo 23
5 3 bar 54
6 5 bar 202
Run Code Online (Sandbox Code Playgroud)
我想要做的是通过ID总结B的总和以及当A是"foo"时B的总和.我可以通过以下几个步骤完成此操作:
require(magrittr)
require(dplyr)
df1 <- df %>%
group_by(ID) %>%
summarize(sumB = sum(B))
df2 <- df %>%
filter(A == "foo") %>%
group_by(ID) %>%
summarize(sumBfoo = …Run Code Online (Sandbox Code Playgroud) 我正在努力改进我的工作流程,并希望社区可以提供见解,因为我对"大数据"相对较新.
我通常从公共来源下载几个可以相互关联的数据帧.在提取了几个数据帧之后,我会在对最终数据集进行回归分析和/或其他推论统计之前,执行各种数据处理步骤(例如,过滤,排序,聚合,自定义计算).
具体而言,您会推荐哪种策略:
要么
sqldf,并使用后续查询sqldf从R中进行最终数据分析之前从该数据库中提取和聚合信息.我看到的问题是,在我的本地计算机上创建的数据库由少数表/数据帧组成,其sqldf大小比仅保存几个单独的.csv文件大.我对统计技术非常熟悉,但我确实在数据库管理和服务器操作方面存在一些知识空白.我熟悉SQL的基本要素,作为一种语言,我知道如何使用sqldf在R工作环境中运行的数据帧.但是,我坦率地不知道它提供了什么优势,而不仅仅是学习如何使用基本R函数来过滤,排序和聚合数据.另外,我已经阅读了一些关于将SQL Server与R配对的大肆宣传的网页,但我不确定这对我来说是否是一个不错的选择,因为我在本地运行所有内容.
关于如何通过将R与SQL的一些实现相结合来改进我的数据处理和分析的新手的任何提示?
先感谢您!
我有两个数据帧df1和df2每个有大约10万行和4列.我使用RODBC/sqlQuery将它们读入R并没有任何问题,但是当我尝试rbind它们时,我得到了最可怕的R错误消息:cannot allocate memory.必须有更有效的方法来rbind提高效率 - 任何人都有他们想要分享的最喜欢的技巧吗?例如,我在doc中找到了这个例子sqldf:
# rbind
a7r <- rbind(a5r, a6r)
a7s <- sqldf("select * from a5s union all select * from a6s")
Run Code Online (Sandbox Code Playgroud)
这是最佳/推荐的方式吗?
更新
我使用上面调用中的关键dbname = tempfile()参数使其工作sqldf,正如JD Long在他对这个问题的回答中所建议的那样
使用时RPostgreSQL我发现我不能sqldf以同样的方式使用.例如,如果我使用以下代码加载库并将数据读入数据框:
library(RPostgreSQL)
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, host="localhost", user="postgres", password="xxx", dbname="yyy", port="5436")
rs <- dbSendQuery(con, "select * from table");
df<- fetch(rs, n = -1); dbClearResult(rs)
dbDisconnect(con)
Run Code Online (Sandbox Code Playgroud)
我知道在数据帧中有这个表的内容df.但是,如果我想使用sqldf我以前执行的命令运行SQL命令:
sqldf("SELECT * FROM df WHERE X > 10")
Run Code Online (Sandbox Code Playgroud)
这不再有效,因为我收到错误消息:
Error in postgresqlNewConnection(drv, ...) :
RS-DBI driver: (could not connect postgres@localhost on dbname "test"
)
Error in !dbPreExists : invalid argument type
Run Code Online (Sandbox Code Playgroud)
我认为这是我操作员的错误,但我无法确定如何提供哪些参数,sqldf以便它只关注数据框并且不会尝试连接到其他任何东西.
我习惯在SQL写数据操作的逻辑,现在我正在学习RI发现自己有时只是想要做的东西,会在SQL简单,但我必须要学会为R一堆东西做在R相同的操作数据框.有简单的工作吗?
Error: Cannot pass NA to dbQuoteIdentifier()
Run Code Online (Sandbox Code Playgroud)
另外:警告信息:
In field_types[] <- field_types[names(data)] :
number of items to replace is not a multiple of replacement length
Run Code Online (Sandbox Code Playgroud)
这是我今天试图用sqldf包运行任何东西的错误信息.昨天运行的相同查询今天没有运行,我做错了什么?
我有一些像这样的查询:
sqldf("select TenScore from data where State_P = 'AndhraPradesh'")
Run Code Online (Sandbox Code Playgroud)
但我有"AndhraPradesh"一个变量stateValue.如何在R中的选择查询中使用此变量以获得与上面相同的结果.
请告诉我语法.
在我的机器上,sqldf将POSIXct从本地时间(我在CST,GMT -0600)更改为GMT/UTC.这是预期的行为吗?我可以阻止R或sqldf这样做吗?这是我的代码:
> library('sqldf')
>
> before <- data.frame(ct_sys = Sys.time())
> before
ct_sys
1 2012-03-01 12:57:58
> after <- sqldf('select * from before')
> after
ct_sys
1 2012-03-01 18:57:58
>
Run Code Online (Sandbox Code Playgroud) 我将一个csv文件加载到我的R中,当我尝试使用sqldf选择一些列时,它总是去
Error in .local(drv, ...) :
Failed to connect to database: Error: Access denied for user
'User'@'localhost' (using password: NO)
Error in !dbPreExists : invalid argument type
Run Code Online (Sandbox Code Playgroud)
我不知道如何解决它.
这是我的脚本:
library("RMySQL")
library(sqldf)
acs<-read.csv("getdata_data_ss06pid.csv",head = T)
sqldf("select pwgtp1 from acs where AGEP < 50")
Run Code Online (Sandbox Code Playgroud) r ×10
sqldf ×10
sql ×3
data.table ×1
database ×1
dataframe ×1
dplyr ×1
memory ×1
postgresql ×1
rpostgresql ×1
sql-server ×1