R将一个数据帧中的值替换为其他数据帧中的值,而行值指示列位置

时间:2019-06-04 14:49:52

标签: r merge vlookup

我有某种高级(?)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中,第三行的第一列包含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)]})),但这没用。

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

我们可以使用行/列索引

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