首页 > 解决方案 > 使用另一个数据框作为 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))

所需的输出如下所示:

在此处输入图像描述

到目前为止,我按照另一篇类似帖子中的建议尝试了此操作,但效果不佳(随机遗漏了一些要点)

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

在此处输入图像描述

请注意,在示例中,为了方便起见,数字只是乘以 10,实际数据中到处都是数字,因此仅将数据帧乘以 10 是行不通的。

标签: rdataframereplacedplyrremap

解决方案


一个选项是match具有第二个数据集的“Cell_ID”的元素,并将其用作索引以从“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)])

推荐阅读