我有某种高级(?)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)]}))
,但这没用。
有什么建议吗?
答案 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