在尊重给定条件的同时将列的值从一个数据框插入到另一个数据框中

Inserting values of a column from one dataframe to another while respecting a given condition

我有两个数据框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

所以我希望 d2avgLostPerRep 列中的值是 "transferred" 到 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 的大数据框。我也试过 UPDATEINSERT INTO 对于 sqldf 无济于事。

基数 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)

你可能想尝试 data.table 包,只要你的问题非常简单,它的语法和键和合并将比基础 R

快得多

重新创建初始数据集:

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")

解决方案:

merge(d1, d2)
# 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

1) 这会沿着指定的列执行左连接:

library(sqldf)
sqldf("select * from d1 left join d2 using(t1, t2, numVehicles)")

我们可以交替使用左自然连接,它会导致连接沿常用命名列发生:

sqldf("select * from d1 left natural join d2")

对于问题中显示的数据,我们可以通过简单地省略上述任何一个中的单词 left 来交替使用内部连接;但是,如果 d1 的每一行的实际数据在 d2 中没有值,则内部联接将省略 d1 的那些行,而左联接将包括它们并添加 NA 表示加入的 d2 列。

2) 第一个 sqldf 语句对应的本机 R 代码是这样的

merge(d1, d2, all.x = TRUE, by = 1:3)

这是第二个:

merge(d1, d2, all.x = TRUE)

在任何一种情况下,都可以通过省略 all.x = TRUE 来获得内部联接。