2015-06-16 123 views
2

我有一個包含100個問題的數據集(下面我有一個包含3個問題的子集)。 我想用「答案」數據集中提供的實際答案替換所有答案ID。最終結果顯示在「結果」數據框中。R用關鍵數據幀替換多列的鍵

數據

name q1 q2 q3 
1  a 1 3 7 
2  a 8 3 1 
3  a 3 9 2 
4  b 4 4 3 

答案

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 

回答

5

我們可以match數據集的元素( 'DF1',沒有 '名稱' 列)與'id'從'answer'得到數字索引(在這種情況下,我們不需要match。一般來說,它是m可以更安全地使用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 

或者使用lookupqdapTools可以採取key/value欄爲 'data.frame'(即 '答案'),並獲得匹配值

library(qdapTools) 
df1[-1] <- lookup(unlist(df1[-1]), answer) 

或者

df1[-1] <- with(answer, setNames(str, id))[as.character(unlist(df1[-1]))] 
+1

將值分配給現有df的好主意。我創建了一個新的。 +1 –

+0

@plafort我確實看到了你的。這取決於OP是否想要更改初始數據集。 +1(已給) – akrun

+0

有沒有辦法將我的函數'answer $ str [x]'傳遞給'sapply'而沒有匿名函數? –

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 

較大的任務可以細分爲測試方法的簡化示例。僅創建一個具有q1值的向量。 v <- c(1,8,3,4)如果我們可以更換這四個,這是完全可能的縮放操作:

answer$str[v] 
[1] TRUE LESS YES NO 

這將創建的第一個問題列。代碼的其餘部分正在爲每列重複該過程。

編輯

沒有sapply更快的方法。只要查找列表按順序並且不重複,它就會工作:

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