R用键数据框替换多列的键
我有一个包含100个问题的数据集(下面我有一个包含3个问题的子集)。 我想用“答案”数据集中提供的实际答案替换所有答案ID。最终结果显示在“结果”数据框中 资料 答复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
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 TryMap('[',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