r - 通过查找矩阵/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 中的值?
解决方案
一个选项是melt
并matrix
加入
library(dplyr)
library(reshape2)
left_join(df, melt(mapping), by = c("rank" = "Var1", "cat" = "Var2"))
推荐阅读
- router - 如何在 airtel 4g 热点设备中禁用睡眠模式?
- sql - 用于形成嵌套 JSON 作为输出的 SQL 脚本
- reactjs - 即使图像路径正确,React-Native -Elements Avatar 也不会渲染并仅显示灰色背景
- php - laravel 7中的Ajax数据表
- angular - 如何为多选控件动态添加[formcontrol]?
- mysql - 如何使用 TypeORM 为用户、组和组元数据创建关系?
- python - 如何在 nodejs 应用程序中使用 python 库
- android - 通过循环获取所有firebase数据
- python - 将值分配给来自 2 个不同文件的字典
- python - GUI 屏幕中的 print() 输出