在遵循给定条件的同时,将列的值从一个数据帧插入到另一个数据帧

时间:2015-04-25 20:43:30

标签: sql r sqldf

我有两个数据框d1d2d2有一个列,其中包含我希望添加到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列中的值被转移"通过匹配d1t1t2numVehicles

所以最后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的大数据框。我还尝试UPDATEINSERT INTO sqldf无效。

3 个答案:

答案 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)