2016-03-06 100 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