我有一个字典(包含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个值。我知道你可以用索引来划分它,但是得到它们有点痛苦,我只是不确定是否有更好的方法来完成我想要做的事情。
发布于 2016-05-26 18:18:20
我们只需要调整循环。在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发布于 2016-05-26 18:54:58
我认为这是可行的,它产生了期望的输出。
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"]
}https://stackoverflow.com/questions/37468129
复制相似问题