根据将其他列与另一个数据框匹配的值填充数据框的缺失值,同时保留不匹配的值
Fill missing values of dataframe based on value of matching other column with another dataframe while keeping non-matching values
我有两个数据框,看起来有点像这样:
dat1 <- data.frame(z = 5:20, val = seq(30, 105, by = 5))
dat2 <- data.frame(z = c(0, 2, 8, 10, 12, 15), val = c(15, 20, 40, 50, NaN, NaN))
看起来像:
dat1 dat2
z val z val
5 30 0 15
6 35 2 20
7 40 8 40
8 45 10 50
9 50 12 NaN
10 55 15 NaN
11 60
12 65
13 70
14 75
15 80
16 85
17 90
18 95
19 100
20 105
我想要的是在z值相同的val列中用相同的值填充第二个dataframe的NaN。
所以我希望我的 dat2 数据框看起来像:
dat2
z val
0 15
2 20
8 40
10 50
12 65
15 80
我考虑过获取 NaN 值的索引,但它们不重叠。我需要以某种方式将它们与 z 列匹配,但用这些值填充 NaN 列。我真的不知道该怎么做。
我已经尝试了答案 ,但所有这些都删除了 dat2 中低于 dat1 最小值的所有值,我也需要保留这些值。
我目前使用的代码:
filled <- inner_join(dat2, dat1, by = "z") %>%
mutate(answer = coalesce(val.x, val.y))
然而,现在的结果是这样的:
dat2
z val
8 40
10 50
12 65
15 80
虽然我也想保留所有其他值。
我们可以 left_join
'z' 和 coalesce
'val' 列
library(dplyr)
left_join(dat2, dat1, by = 'z') %>%
transmute(z, val = coalesce(val.x, val.y))
# z val
#1 0 15
#2 2 20
#3 8 40
#4 10 50
#5 12 65
#6 15 80
我有两个数据框,看起来有点像这样:
dat1 <- data.frame(z = 5:20, val = seq(30, 105, by = 5))
dat2 <- data.frame(z = c(0, 2, 8, 10, 12, 15), val = c(15, 20, 40, 50, NaN, NaN))
看起来像:
dat1 dat2
z val z val
5 30 0 15
6 35 2 20
7 40 8 40
8 45 10 50
9 50 12 NaN
10 55 15 NaN
11 60
12 65
13 70
14 75
15 80
16 85
17 90
18 95
19 100
20 105
我想要的是在z值相同的val列中用相同的值填充第二个dataframe的NaN。
所以我希望我的 dat2 数据框看起来像:
dat2
z val
0 15
2 20
8 40
10 50
12 65
15 80
我考虑过获取 NaN 值的索引,但它们不重叠。我需要以某种方式将它们与 z 列匹配,但用这些值填充 NaN 列。我真的不知道该怎么做。
我已经尝试了答案
我目前使用的代码:
filled <- inner_join(dat2, dat1, by = "z") %>%
mutate(answer = coalesce(val.x, val.y))
然而,现在的结果是这样的:
dat2
z val
8 40
10 50
12 65
15 80
虽然我也想保留所有其他值。
我们可以 left_join
'z' 和 coalesce
'val' 列
library(dplyr)
left_join(dat2, dat1, by = 'z') %>%
transmute(z, val = coalesce(val.x, val.y))
# z val
#1 0 15
#2 2 20
#3 8 40
#4 10 50
#5 12 65
#6 15 80