使用映射表清理数据

时间:2016-03-06 06:38:36

标签: r

我正在尝试使用映射表清理数据并寻找实现该目标的最佳方法。

以下是一些示例数据:

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")

但是,当您创建新列,删除旧列然后重命名时,这似乎有点笨拙。有一个更好的方法吗;喜欢合并到现有列的选项吗?

2 个答案:

答案 0 :(得分:2)

或者使用Map或类似内容循环浏览df并从o应用变量中获取相应的m输出。

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中。

答案 1 :(得分: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