使用另一个数据框作为 R 中的键替换数据框中的所有值

Replace all values in dataframe using another dataframe as key in R

我有两个数据框,我想使用 df2 中的等效值 (df2$value) 替换 df1 的所有值(在所有列中)。

df1

structure(list(Cell_ID = c(7L, 2L, 3L, 10L), n_1 = c(0L, 0L, 
0L, 0L), n_2 = c(9L, 1L, 4L, 1L), n_3 = c(10L, 4L, 5L, 2L), n_4 = c(NA, 
5L, NA, 4L), n_5 = c(NA, 7L, NA, 6L), n_6 = c(NA, 9L, NA, 8L), 
    n_7 = c(NA, 10L, NA, 3L)), class = "data.frame", row.names = c(NA, 
-4L))

df2

structure(list(Cell_ID = 0:10, value = c(5L, 100L, 200L, 300L, 
400L, 500L, 600L, 700L, 800L, 900L, 1000L)), class = "data.frame", row.names = c(NA, 
-11L))

所需的输出如下所示:

到目前为止,我按照另一个类似 post 中的建议进行了尝试,但效果不佳(随机遗漏了一些点)

key= df2$Cell_ID
value = df2$value
lapply(1:8,FUN = function(i){df1[df1 == key[i]] <<- value[i]})

注意在示例中,数字只是乘以 10 以方便实际数据中到处都是数字,因此只需将数据帧乘以 10 就不会工作。

一个选项是 match 具有第二个数据集 'Cell_ID' 的元素,并将其用作 return 对应 'value' 来自 'df2'[ 的索引

library(dplyr)
df1 %>%
     mutate(across(everything(), ~  df2$value[match(., df2$Cell_ID)]))

-输出

#  Cell_ID n_1 n_2  n_3 n_4 n_5 n_6  n_7
#1     700   5 900 1000  NA  NA  NA   NA
#2     200   5 100  400 500 700 900 1000
#3     300   5 400  500  NA  NA  NA   NA
#4    1000   5 100  200 400 600 800  300

或者另一种选择是使用命名向量进行匹配

library(tibble)
df1 %>%
      mutate(across(everything(), ~ deframe(df2)[as.character(.)]))

base R等价于

df1[] <- lapply(df1, function(x) df2$value[match(x, df2$Cell_ID)])