使用另一个数据框作为 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)])
我有两个数据框,我想使用 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)])