有条理地从R

时间:2016-04-05 18:02:15

标签: r

我想有条件地用另一个数据帧(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

1 个答案:

答案 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)