我有两个数据框d1
和d2
。 d2
有一个列,其中包含我希望添加到d1
的数据。
每个数据框都有相同数量的行和列。
> d1
t1 t2 numVehicles avgByRunRep
1 0.2 0.3 10 225.5000
2 0.2 0.4 10 219.6667
3 0.2 0.5 10 205.1667
4 0.2 0.6 10 220.6667
5 0.2 0.7 10 205.1667
> d2
t1 t2 numVehicles avgLostPerRep
1 0.2 0.3 10 14.333333
2 0.2 0.4 10 9.000000
3 0.2 0.5 10 8.000000
4 0.2 0.6 10 8.000000
5 0.2 0.7 10 6.833333
所以我希望d2
' avgLostPerRep
列中的值被转移"通过匹配d1
,t1
,t2
来numVehicles
。
所以最后d1
看起来像是:
> d1
t1 t2 numVehicles avgByRunRep avgLostPerRep
1 0.2 0.3 10 225.5000 14.333333
2 0.2 0.4 10 219.6667 9.000000
3 0.2 0.5 10 205.1667 8.000000
4 0.2 0.6 10 220.6667 8.000000
5 0.2 0.7 10 205.1667 6.833333
也可以将最终结果数据框保存在另一个变量d3
中,如果这有任何差别的话。
我想知道如何使用sqldf
解决这个问题,但纯R
也可以。
我尝试了来自R的merge
,但获得了一个包含大量NA
的大数据框。我还尝试UPDATE
和INSERT INTO
sqldf
无效。
答案 0 :(得分:1)
你可能想尝试使用data.table包,只要你的问题非常简单,它的语法和键和合并将比基础R快得多
重新创建初始数据集:
<ItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Width="{Binding Width}" Height="{Binding Height}" Fill="Black">
<Rectangle.RenderTransform>
<TranslateTransform X="{Binding X}" Y="{Binding Y}" />
</Rectangle.RenderTransform>
</Rectangle>
</DataTemplate>
</ItemsControl.ItemTemplate>
解决方案:
library(data.table)
d1<- fread("t1,t2,numVehicles,avgByRunRep
0.2,0.3,10,225.5000
0.2,0.4,10,219.6667
0.2,0.5,10,205.1667
0.2,0.6,10,220.6667
0.2,0.7,10,205.1667")
# setting desired columns as keys is important in your case
# and setkey(d1) would be enough to use all columns in d1
setkey(d1, t1, t2, numVehicles)
d2<- fread("t1,t2,numVehicles,avgLostPerRep
0.2,0.3,10,14.333333
0.2,0.4,10,9.000000
0.2,0.5,10,8.000000
0.2,0.6,10,8.000000
0.2,0.7,10,6.833333")
答案 1 :(得分:1)
1)这将沿指示的列执行左连接:
library(sqldf)
sqldf("select * from d1 left join d2 using(t1, t2, numVehicles)")
我们可以交替使用左自然连接,这会导致连接沿着通常命名的列发生:
sqldf("select * from d1 left natural join d2")
对于问题中显示的数据,我们可以通过简单地省略上述任何一个中的单词left
来交替使用内连接;但是,如果实际数据在d2
的每一行中都没有d1
的值,那么内连接将省略d1
的那些行,而左连接将包括它们并添加{已加入NA
列的{1}}。
2)对于第一个sqldf语句,相应的本机R代码将是这个
d2
这是第二次:
merge(d1, d2, all.x = TRUE, by = 1:3)
通过在任何一种情况下省略merge(d1, d2, all.x = TRUE)
来获得内部联接。
答案 2 :(得分:0)
基地R:
merge(d1, d2)
sqldf:
library(sqldf)
query = "SELECT a.t1, a.t2, a.numVehicles, a.avgByRunRep, b.avgLostPerRep FROM d1 a INNER JOIN d2 b WHERE a.t2=b.t2"
sqldf(query)