r - R将一个数据帧中的值替换为其他数据帧中的值,其中行值表示列位置
问题描述
我有某种高级(?)vlookup问题我想知道它是否可以在R中完成(在Excel中没问题)。
我有以下数据框:
dat <- data.frame(Var1 = c(1,2,3,4,5),
Var2 = c(5,4,3,2,1),
Var3 = c(5,5,5,5,5),
Var4 = c(1,1,1,1,1))
在此数据框中,值指向第二个数据框中的列位置:
lookup = data.frame(l1 = c(10,11,12,13,14),
l2 = c(20,21,22,23,24),
l3 = c(30,31,32,33,34),
l4 = c(40,41,42,43,44),
l5 = c(50,51,52,53,54))
所以看dat
,第一行第 3 列包含 5,这意味着我想用lookup
数据帧中的第一行值第 5 列(即 50)替换这个值。dat[2,2]
应该改成21。
预期结果是:
Var1 Var2 Var3 Var4
10 50 50 10
21 41 51 11
...
在 Excel 中执行此操作非常简单,但在 R 中我无法理解它。我尝试过。沿着:
combined = as.data.frame(lapply(dat, function(x) {lookup[, names(lookup) == paste0("l",x)]}))
,但这没有用。
有什么建议么?
解决方案
我们可以使用行/列索引
dat[] <- lookup[cbind(c(row(dat)), unlist(dat))]
dat
# Var1 Var2 Var3 Var4
#1 10 50 50 10
#2 21 41 51 11
#3 32 32 52 12
#4 43 23 53 13
#5 54 14 54 14
推荐阅读
- python - 在消息 [discord.py] 上创建 DM
- php - Laravel 模型批量更新 - Builder::cleanBindings() 必须是数组类型,给定 null
- reactjs - 如何在 Socket.io 中触发真正的错误?
- flutter - 从外部更新 RepaintBoundary 内部
- generics - 通用数学运算符重载而不复制
- docker - 有没有办法将 USER 保留在 docker 基础映像上?
- c++ - 将一对映射到结构
- r - 如何在 r 中使用 VIF?
- excel - 在空白单元格下方的行中注入公式
- python - 在 Python 中根据时间序列数据分配组号