在尊重给定条件的同时将列的值从一个数据框插入到另一个数据框中
Inserting values of a column from one dataframe to another while respecting a given condition
我有两个数据框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
列中的值是 "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
的大数据框。我也试过 UPDATE
和 INSERT 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
来获得内部联接。
我有两个数据框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
列中的值是 "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
的大数据框。我也试过 UPDATE
和 INSERT 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
来获得内部联接。