我有一个字典(包含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个值。我知道你可以用索引对它进行子集化,但是获取它们有点痛苦,我只是不确定是否有更好的方法来完成我想要做的事情。
答案 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"]
}