替换有条件地匹配R中值列表的列值

zte4gxcn  于 2023-03-05  发布在  其他
关注(0)|答案(2)|浏览(89)

当一个 Dataframe 中的值与另一个小得多的 Dataframe 中的标识符匹配时,我试图替换其中的值。

df1 = data.frame(row = seq(1,6),
                   x = c("a","b","c","d","e","f"))

df2 = data.frame(row = c(5,3,1,15,10),
                 x2 = c("g","h","i","j","k"))

df3 = df1 %>% mutate(x = case_when(
  df1$row == df2$row ~ df2$x2,
  .default = df1$x
))

我尝试读取以下内容:当df1$row与df2$row匹配时,用df2$x2中的值替换df1$x,否则保留df1$x。

df3
  row x
1   1 i
2   2 b
3   3 h
4   4 d
5   5 g
6   6 f

任何帮助都感激不尽。

7tofc5zh

7tofc5zh1#

我们可以用row乘以join,然后使用coalesce

library(dplyr)
df1 %>%
    left_join(df2, by = 'row') %>%
    mutate(x = coalesce(x2, x), .keep = 'unused')

  row x
1   1 i
2   2 b
3   3 h
4   4 d
5   5 g
6   6 f
qhhrdooz

qhhrdooz2#

使用dplyr 1.1.0:

df1 %>%
  rows_update(df2 %>% rename(x = x2), unmatched = "ignore")

结果

Matching, by = "row"
  row x
1   1 i
2   2 b
3   3 h
4   4 d
5   5 g
6   6 f

如果两个表具有相同的行名称,则会更简单:

df1 %>%
  rows_update(df2, unmatched = "ignore")

相关问题