从两个具有不同行的数据框创建新数据库

create new database from two dataframes, with different rows

我有两个数据帧,df1 19600 行和 df2 18830 行,df2$iddf1$id 中找到对应关系,而其余 770 行没有对应关系,我想合并创建 df3 的两个数据帧,列 df3$id 等于 df1$id ,如果行匹配 df2 它给我值 df2$value ,否则它给我0,所以在770个不匹配的地方我将有0作为值

让我们尝试用玩具数据集重现您的问题:

df1 <- data.frame(id = 1:5, values = 1:5)
df2 <- data.frame(id = 3:7, values = 6:10)

df1
#>   id values
#> 1  1      1
#> 2  2      2
#> 3  3      3
#> 4  4      4
#> 5  5      5

df2
#>   id values
#> 1  3      6
#> 2  4      7
#> 3  5      8
#> 4  6      9
#> 5  7     10

那么在 base R 中实现这个的天真的方法是:

df3        <- df1
df3$values <- df2$values[match(df3$id, df2$id)]
df3$values[is.na(df3$values)] <- 0

导致:

df3
#>   id values
#> 1  1      0
#> 2  2      0
#> 3  3      6
#> 4  4      7
#> 5  5      8

您会看到 id 1 和 2 出现在 df1 而不是 df2 中。这些行中的 values 列的最终结果为 0,但是在匹配的地方,将 df2 中正确的 values 写在相应的位置。

reprex package (v2.0.1)

于 2022-02-05 创建

使用data.table()

library(data.table)

DT1 =  data.table(ID = c(1:15),
                  Value = c(3:10))

DT2 = data.table(ID = c(1:10),
                 Value = c(7:13))

连接表然后重新编码变量:

DT3 = DT2[DT1, on = .(ID)][, .(ID,Value)]

DT3[!ID %in% DT2$ID, Value := 0] 

tail(DT3)

输出

 ID Value
1: 10     9
2: 11     0
3: 12     0
4: 13     0
5: 14     0
6: 15     0