2016-03-06 48 views
0

我試圖用映射表清理數據並尋找實現該目的的最佳方法。使用映射表清理數據

下面是一些樣本數據:

df <- data.frame(Q1 = c("Yes", "Yes", "Non"), 
       Q2 = c("Non", "No", "Oui")) 

我有一個映射錶轉換這些問題的答案爲TRUE/FALSE

map <- data.frame(answer = c("Yes", "Oui", "No", "Non"), 
        mapping = c(TRUE, TRUE, FALSE, FALSE)) 

這就是我想要的輸出

out <- data.frame(Q1 = c(TRUE, TRUE, FALSE), 
        Q2 = c(FALSE, FALSE, TRUE)) 

我試過這種方法:

out <- merge(df, map, by.x = "Q1", by.y = "answer", all.x = TRUE) 
out <- merge(out, map, by.x = "Q2", by.y = "answer", all.x = TRUE) 
out <- out[ , 3:4] 
names(out) <- c("Q1", "Q2") 

但是,當您創建新列,刪除舊的,然後重命名時,這看起來很笨拙。有一個更好的方法嗎;就像合併到現有列中的選項一樣?

回答

0

你可以試試plyr::mapvalues

> mapvalues(df$Q1, from = map$answer, to = map$mapping) 
The following `from` values were not present in `x`: Oui, No 
[1] TRUE TRUE FALSE 
Levels: FALSE TRUE 
+0

正是我之後,謝謝! – Mist

2

或者使用Map或類似的東西循環通過df和抓住從m apping變量對應o本安輸出。

Map(function(x,m,o) o[match(x,m)], df, map["answer"], map["mapping"]) 
#$Q1 
#[1] TRUE TRUE FALSE 
# 
#$Q2 
#[1] FALSE FALSE TRUE 

如果您需要轉換結果,請將它們都包含在data.frame中。

+0

不錯,我也會玩。 – Mist