从两个具有不同行的数据框创建新数据库
create new database from two dataframes, with different rows
我有两个数据帧,df1
19600 行和 df2
18830 行,df2$id
在 df1$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
我有两个数据帧,df1
19600 行和 df2
18830 行,df2$id
在 df1$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