r - 使用另一个数据框作为 R 中的键替换数据框中的所有值
问题描述
我有两个数据框,我想使用 df2 中的等效值(df2$value)替换 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))
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 是行不通的。
解决方案
一个选项是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)])
推荐阅读
- c - 当我在禁用优化的情况下编译时,为什么 clang 不使用 memory-destination x86 指令?他们有效率吗?
- javascript - 使用插入值显示斐波那契数列
- django - 在保存到 Django admin 之前使用外键模型中的数据
- r - 如何为我的网络中的某些节点添加标签
- php - 使用可变变量提取json数据?
- javascript - 我正在尝试使用 onClick 侦听器在反应中呈现输入表单,但它不起作用
- c++ - Arduino char数组到整数值
- sabre - SpecialServiceRQ:未找到有效航段 - 检查行程
- c - OpenSSL 将现有分配的数组归零
- node.js - ReactJS npm test : SyntaxError: Unexpected identifier "Import"