首页 > 解决方案 > 通过查找矩阵/df 更改数据框中的值

问题描述

我有一个数据框:

df <- data.frame(rank = c('R1', 'R2', 'R3' ), cat = c(1, 2, 2))
rank cat
1   R1   1
2   R2   2
3   R3   2

然后是一个映射表,我将其存储为矩阵(但它也可以是另一种格式)

mapping <- matrix(c('A', 'A', 'A', 'C', 'B', 'D'), nrow=3, ncol=2) 
rownames(mapping) <- c('R1', 'R2', 'R3')
colnames(mapping) <- c(1, 2)

   1   2  
R1 "A" "C"
R2 "A" "B"
R3 "A" "D"

所以,我希望 df 引用带有输出的映射,例如

rank == R1 and cat == 1: out == A

通常我将行列对展开并将其合并到原始 df,但在这种情况下,映射表实际上非常大(dim = 8x8)。所以,我想不出解决办法。我还尝试链接多个 if-else(下面的小示例),

if (df$rank == 'R1' & df$cat == 1) {
  df$out<- 'A'
  } else if(df$rank == 'R2' & df$cat == 2) {
    df$out <- 'C'
  } else {
      df$out<- 'X'
      }

但这也变得太复杂(并给出错误)。

如何从映射表中替换 df 中的值?

标签: r

解决方案


一个选项是meltmatrix加入

library(dplyr)
library(reshape2)
left_join(df, melt(mapping), by = c("rank" = "Var1", "cat" = "Var2"))

推荐阅读