基本上,我想这样做:
update vehicles_vehicle v
join shipments_shipment s on v.shipment_id=s.id
set v.price=s.price_per_vehicle;
Run Code Online (Sandbox Code Playgroud)
我很确定它可以在MySQL(我的背景)中工作,但它似乎不适用于postgres.我得到的错误是:
ERROR: syntax error at or near "join"
LINE 1: update vehicles_vehicle v join shipments_shipment s on v.shi...
^
Run Code Online (Sandbox Code Playgroud)
当然有一种简单的方法可以做到这一点,但我找不到合适的语法.那么,我如何在PostgreSQL中编写这个?
LEFT| RIGHT| FULL)(INNER| OUTER)连接?merge?join?concat?update?谁?什么?为什么?!... 和更多.我已经看到了这些反复出现的问题,询问了pandas合并功能的各个方面.今天关于合并及其各种用例的大部分信息在几十个措辞严厉,不可搜索的帖子中都是分散的.这里的目的是为后代整理一些更重要的观点.
这个QnA应该是关于常见熊猫习语的一系列有用的用户指南的下一部分(参见关于转动的这篇文章,以及关于连接的这篇文章,我将在稍后介绍).
请注意,这篇文章并不是文档的替代品,所以请阅读它!一些例子来自那里.
是否可以对两个没有相同列的数据帧进行行绑定?我希望保留绑定后不匹配的列.
给出两个数据帧a和b:
> a
a b c
1 -0.2246894 -1.48167912 -1.65099363
2 0.5559320 -0.87898575 -0.15634590
3 1.8469466 -0.01487524 -0.53098215
4 -0.6875051 0.23880967 0.01824621
5 -0.6735163 0.75485292 0.44154092
> b
a c
1 0.4287284 -0.3295925
2 0.5201492 0.3341251
3 -2.6355570 1.7916780
4 -1.3645337 1.3642276
5 -0.4954542 -0.6660001
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方法来连接这些以便返回下面表单的新数据框?
> new
a b c
1 -0.2246894 -1.48167912106676 -1.65099363
2 0.5559320 -0.878985746842256 -0.15634590
3 1.8469466 -0.0148752354840942 -0.53098215
4 -0.6875051 0.238809666690982 0.01824621
5 -0.6735163 0.754852923524198 0.44154092
6 0.4287284 NA -0.32959248
7 …Run Code Online (Sandbox Code Playgroud) 这是关于data.table连接语法的一个哲学问题.我发现data.tables的用途越来越多,但仍在学习......
X[Y]data.tables 的连接格式非常简洁,方便和高效,但据我所知,它只支持内连接和右外连接.要获得左外部或全外部连接,我需要使用merge:
X[Y, nomatch = NA] - Y中的所有行 - 右外连接(默认)X[Y, nomatch = 0] - 只有在X和Y中都匹配的行 - 内连接merge(X, Y, all = TRUE) - 来自X和Y的所有行 - 完全外部连接merge(X, Y, all.x = TRUE) - X中的所有行 - 左外连接在我看来,如果X[Y]连接格式支持所有4种类型的连接,那将会很方便.有没有理由只支持两种类型的连接?
对我来说,nomatch = 0和nomatch = NA参数值对于正在执行的操作不是非常直观.这是我更容易理解和记忆的merge语法:all = TRUE,all.x = TRUE和all.y = TRUE.由于X[Y]操作类似于merge远远不止match,为什么不使用merge的连接,而不是语法match功能的nomatch参数?
以下是4种连接类型的代码示例:
# …Run Code Online (Sandbox Code Playgroud) 例如(不确定是否最具代表性的例子):
N <- 1e6
d1 <- data.frame(x=sample(N,N), y1=rnorm(N))
d2 <- data.frame(x=sample(N,N), y2=rnorm(N))
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止所得到的:
d <- merge(d1,d2)
# 7.6 sec
library(plyr)
d <- join(d1,d2)
# 2.9 sec
library(data.table)
dt1 <- data.table(d1, key="x")
dt2 <- data.table(d2, key="x")
d <- data.frame( dt1[dt2,list(x,y1,y2=dt2$y2)] )
# 4.9 sec
library(sqldf)
sqldf()
sqldf("create index ix1 on d1(x)")
sqldf("create index ix2 on d2(x)")
d <- sqldf("select * from d1 inner join d2 on d1.x=d2.x")
sqldf()
# 17.4 sec
Run Code Online (Sandbox Code Playgroud) 我知道我可以使用它plyr和它的朋友组合数据帧,merge但是到目前为止我不知道如何根据2列合并两个数据帧和多列?
在matlab中,有一种方法可以在一个向量中找到值,但在另一个向量中却找不到.
例如:
x <- c(1,2,3,4)
y <- c(2,3,4)
Run Code Online (Sandbox Code Playgroud)
是那里会告诉我,在价值的任何功能x,在不y为1?
注意:这个问题和以下答案涉及data.table版本<1.5.3; v.1.5.3于2011年2月发布以解决此问题.查看更新的处理(03-2012):将外键上的SQL连接转换为R data.table语法
我一直在挖掘data.table包的文档(data.frame的替代品,对于某些操作来说效率更高),包括Josh Reich在纽约R Meetup(pdf)上关于SQL和data.table的演示,但是无法想象这完全琐碎的操作.
> x <- DT(a=1:3, b=2:4, key='a')
> x
a b
[1,] 1 2
[2,] 2 3
[3,] 3 4
> y <- DT(a=1:3, c=c('a','b','c'), key='a')
> y
a c
[1,] 1 a
[2,] 2 b
[3,] 3 c
> x[y]
a b
[1,] 1 2
[2,] 2 3
[3,] 3 4
> merge(x,y)
a b c
1 1 2 a
2 2 3 b …Run Code Online (Sandbox Code Playgroud) 我试图更多地了解滚动连接的工作方式和一些混乱,我希望有人可以为我澄清这一点.举一个具体的例子:
dt1 <- data.table(id=rep(1:5, 10), t=1:50, val1=1:50, key="id,t")
dt2 <- data.table(id=rep(1:5, 2), t=1:10, val2=1:10, key="id,t")
Run Code Online (Sandbox Code Playgroud)
我希望这会生成一个long data.table,其中值为dt2:
dt1[dt2,roll=TRUE]
Run Code Online (Sandbox Code Playgroud)
相反,正确的方法似乎是:
dt2[dt1,roll=TRUE]
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释更多关于如何加入data.table作品,因为我显然没有正确理解它.我认为这dt1[dt2,roll=TRUE]对应于sql等价select * from dt1 right join dt2 on (dt1.id = dt2.id and dt1.t = dt2.t),除了增加的功能locf.
另外文档说:
X[Y] is a join, looking up X's rows using Y (or Y's key if it has one)
as an index.
Run Code Online (Sandbox Code Playgroud)
这使得似乎只返回X中的内容,正在进行的连接是内连接,而不是外连接.roll=T那个什么时候但那个特别id不存在dt1?多玩一点我无法理解列中放置了什么值.
r ×8
data.table ×4
join ×4
merge ×4
dataframe ×3
pandas ×1
performance ×1
postgresql ×1
python ×1
r-faq ×1
syntax ×1
time-series ×1
vector ×1