使用 R 使用两个数据表中的匹配值创建数据表



我有两个使用 R 的data.tables(a 和 b(,每个大约有 10,000 行。每个data.table包含三列:x、y 和 z。z 值在每个data.table中都是唯一的。每个data.table共享许多相同的 x 和 y 值。我需要做的是创建一个新的data.table(c(,它只包含 a 中的行,其中 x 和 y 值与 b 中的值相同。

以下是我需要实现的示例。

数据表 A

x    y      z
a    1    100
a    6    120
c    5    234
b    3    567
d    8    645
f    7    487

数据表 B

x    y     z
a    1    904
b    6    120
c    7    765
e    3    567
d    8    329
a    0    638

数据表 c(新创建的数据表(应如下所示

x    y     z
a    1    100
d    8    645

我看过这里(根据重叠日期匹配数据帧之间的值(,但它并没有完全让我到达我需要的地方。

下面是生成示例data.tables的代码。

library(data.table)
x<-c("a","a","c","b","d","f")
y<-c(1,6,5,3,8,7)
z<-c(100,120,234,567,645,487)
a<-data.frame(x,y,z)
rm(x,y,z)
x<-c("a","b","c","e","d","a")
y<-c(1,6,7,3,8,0)
z<-c(904,120,765,567,329,638)
b<-data.frame(x,y,z)
setDT(a)
setDT(b)

很乐意接受使用传统data.frames的建议

谢谢

一个简单的merge就可以做到:

merge(a, b, by=c("x","y"))

默认情况下,merge仅保留两个数据集中存在匹配项的行;您可以使用allall.xall.y参数更改此行为,但在这里您不需要这样做。

如果您不希望数据表b中的z值,请执行以下操作:

merge(a, b[,.(x,y)], by=c("x","y"))

或者,dplyr的方法:

library(dplyr)
c <- a %>% semi_join(b, by = c("x", "y"))
> c
x y   z
1 a 1 100
2 d 8 645

尝试:

# Note that they should be different values of z for identical x and y
# The following options assume that you also want to keep this information i.e. z values 
# from a and b for matched columns x and y
dplyr::inner_join(a, b, by = c("x", "y")) # option 1
merge(a, b, by = c("x","y")) # option 2
# option 3 using DT
setkeyv(a, c("x","y"))
setkeyv(b, c("x","y"))
a[b, nomatch = 0]

最新更新