R消除字典

时间:2016-05-26 18:07:16

标签: r

我有一个字典(包含2列的表格表),其中一些值与某些键匹配。在这些情况下,我想用他们指向的键中的值替换值。

示例:

Key,   Value
"aa",  "ac"
"ab",  "ba"
"ac",  "ad"
"ad",  "da"
"ae",  "ac"

我想要制作的东西:

Key,   Value
"aa",  "da"
"ab",  "ba"
"ac",  "da"
"ad",  "da"
"ae",  "da"

我尝试过:

dict <- data.frame(key=c("aa","ab","ac","ad","ae"),value=c("ac","ba","ad","da","ac"))
repeat {
    needs_replacing <- dict[dict$Value %in% dict$Key,]
    if(nrow(needs_replacing) == 0) {
        break;
    }
    replacements <- dict[dict$Key %in% needs_replacing$Value,]
    dict[dict$Value %in% dict$Key,]$Value <- replacements[?????,]$Value
}

我遇到的问题是replacements在第一次迭代时只有3个值,但我正在尝试扩展它以替换4个值。我知道你可以用索引对它进行子集化,但是获取它们有点痛苦,我只是不确定是否有更好的方法来完成我想要做的事情。

2 个答案:

答案 0 :(得分:3)

我们只需要调整循环。在replacements表达式中,match优于%in%,因为它将返回匹配的索引,而后者将返回与位置无关的逻辑:

repeat {
  needs_replacing <- dict$value[dict$value %in% dict$key]
  if(length(needs_replacing) == 0) {
    break;
  }
  replacements <- dict$value[match(needs_replacing, dict$key)]
  dict$value[dict$value %in% dict$key] <- replacements
}
dict
#   key value
# 1  aa    da
# 2  ab    ba
# 3  ac    da
# 4  ad    da
# 5  ae    da

答案 1 :(得分:0)

我认为这会起作用,它会产生所需的输出。

while(length(dict[dict$Value %in% dict$Key, "Value"]) > 0) {
  dict[dict$Value %in% dict$Key, "Value"] <- 
  dict[match(dict[dict$Value %in% dict$Key, "Value"], dict$Key), "Value"]
}