R用键数据框替换多列的键

R用键数据框替换多列的键,r,key,match,R,Key,Match,我有一个包含100个问题的数据集(下面我有一个包含3个问题的子集)。 我想用“答案”数据集中提供的实际答案替换所有答案ID。最终结果显示在“结果”数据框中 资料 答复 id str 1 TRUE 2 FALSE 3 YES 4 NO 5 LESS 6 MORE 7 GREATER 8 LESS 9 NONE 10 DAILY

我有一个包含100个问题的数据集(下面我有一个包含3个问题的子集)。 我想用“答案”数据集中提供的实际答案替换所有答案ID。最终结果显示在“结果”数据框中

资料

答复

 id   str  
    1   TRUE   
    2   FALSE   
    3   YES   
    4   NO
    5   LESS   
    6   MORE   
    7   GREATER   
    8   LESS
    9   NONE   
   10  DAILY   
结果

  name     q1   q2     q3
1    a    TRUE  YES   GREATER
2    a    LESS  YES   TRUE
3    a    YES   NONE  FALSE
4    b    NO    NO    YES

我们可以
match
将数据集的元素('df1',不带'name'列)与'answer'中的'id'进行匹配,以获得数字索引(在这种情况下,我们不需要
match
。通常,使用
match
)并获得相应的'str'可能更安全

 df1[-1] <- answer$str[match(as.matrix(df1[-1]), answer$id)]
 df1
 # name   q1   q2      q3
 #1    a TRUE  YES GREATER
 #2    a LESS  YES    TRUE
 #3    a  YES NONE   FALSE
 #4    b   NO   NO     YES

df1[-1]或使用索引:

data[-1] <- sapply(data[-1], function(x) answer$str[x])
#   name   q1   q2      q3
# 1    a TRUE  YES GREATER
# 2    a LESS  YES    TRUE
# 3    a  YES NONE   FALSE
# 4    b   NO   NO     YES
这将创建第一个问题列。代码的其余部分将对每列重复该过程

编辑

一种没有
的快速方法。只要查找列表有序且不重复,它就会工作:

data[-1] <- answer$str[as.matrix(data[-1])]
#   name   q1   q2      q3
# 1    a TRUE  YES GREATER
# 2    a LESS  YES    TRUE
# 3    a  YES NONE   FALSE
# 4    b   NO   NO     YES

data[-1]将值分配给现有df的好主意。我创建了一个新的+1@plafort我确实看到了你的。这取决于OP是否要更改初始数据集+1(已经给出)有没有一种方法可以将我的函数
answer$str[x]
传递给
sapply
而不使用匿名函数?@plafort Try
Map('[',list(answer$str),df1[-1])
我找到了另一种使用
as.matrix
 df1[-1] <- with(answer, setNames(str, id))[as.character(unlist(df1[-1]))]
data[-1] <- sapply(data[-1], function(x) answer$str[x])
#   name   q1   q2      q3
# 1    a TRUE  YES GREATER
# 2    a LESS  YES    TRUE
# 3    a  YES NONE   FALSE
# 4    b   NO   NO     YES
answer$str[v]
[1] TRUE LESS YES  NO 
data[-1] <- answer$str[as.matrix(data[-1])]
#   name   q1   q2      q3
# 1    a TRUE  YES GREATER
# 2    a LESS  YES    TRUE
# 3    a  YES NONE   FALSE
# 4    b   NO   NO     YES