我想有条件地用另一个数据帧(df2 $ y)中的值替换数据帧(df1)的列(df1 $ y)中的值。这些数据帧具有共享ID列(x)。 df1的行数多于df2,并且其值不在df2中。
条件是:如果df1 $ x == df2 $ x,将df1 $ y替换为df2 $ y,如果没有匹配则不执行任何操作
例如:
> df1 <- data.frame(x = c(1, 1, 2, 3, 4, 4, 4, 5, 6, 7),
y = c(100, 100, 50, 50, 75, 75, 75, 50, 100, 25))
> df1
x y
1 1 100
2 1 100
3 2 50
4 3 50
5 4 75
6 4 75
7 4 75
8 5 50
9 6 100
10 7 25
> df2 <- data.frame(x = c(2, 4, 6, 7), y = c(25, 100, 75, 100))
> df2
x y
1 2 25
2 4 100
3 6 75
4 7 100
所需的输出是:
df1
x y
1 100
1 25
2 50
3 50
4 100
4 100
4 100
5 50
6 75
7 100
这是我在这里发布的第一个问题,请原谅我是否已在另一个问题中回答。
这个问题与Transfer values from one dataframe to another不同,因为我问如何有条件地替换df1 $ y值,但保留df1.x!= df2.x的值。在链接到问题中,不符合条件的值是NA值。请参阅下面的示例,使用sqldf()基于上面链接的答案。
> sqldf('SELECT df1.x , df2.y
+ FROM df1
+ LEFT JOIN df2
+ ON df2.x = df1.x')
x y
1 1 NA
2 1 NA
3 2 25
4 3 NA
5 4 100
6 4 100
7 4 100
8 5 NA
9 6 75
10 7 100
答案 0 :(得分:2)
您可以先合并两个数据框,然后使用 dplyr 包替换元素。
library(dplyr)
df1 <- merge(df1, df2, by = "x", all = T) %>% mutate(y = ifelse(is.na(y.y), y.x, y.y)) %>% select(x, y)