我正在尝试使用映射表清理数据并寻找实现该目标的最佳方法。
以下是一些示例数据:
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 :(得分: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