首页 > 解决方案 > 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)]})),但这没有用。

有什么建议么?

标签: rmergevlookup

解决方案


我们可以使用行/列索引

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

推荐阅读