如何用Base R实现plyr::revalue的查找表字符匹配功能?
使用Base R重现plyr::revalue的功能
我们需要用Base R实现和plyr::revalue相同的功能——基于查找表替换向量中的匹配值,未匹配的值保持原样。以下是基于命名向量和data.frame两种查找表的实现方法:
原始示例代码
首先给出原问题中的参考代码(使用plyr::revalue的实现):
lookupDF <- data.frame(shortName=c("app","or","ba","ma","unk"), longName=c("Apple", "Orange", "Banana", "Mango", "Something Else")) lookupVec <- lookupDF$longName names(lookupVec) <- lookupDF$shortName foo <- c("or","app","def","app","abc","ban") # plyr的实现效果 plyr::revalue(foo, lookupVec) # 输出: [1] "Orange" "Apple" "def" "Apple" "abc" "ban"
方法1:使用命名向量(lookupVec)
利用命名向量的索引特性,再将未匹配产生的NA替换为原向量的对应值:
# Base R实现 result_vec <- lookupVec[foo] # 将NA替换为原foo的对应值 result_vec[is.na(result_vec)] <- foo[is.na(result_vec)] result_vec # 输出与plyr::revalue完全一致
也可以用更简洁的ifelse写法:
result_vec <- ifelse(is.na(lookupVec[foo]), foo, lookupVec[foo])
方法2:使用data.frame(lookupDF)
通过match函数找到匹配的位置,再结合ifelse处理未匹配的情况:
# 找到foo元素在lookupDF$shortName中的匹配索引 match_pos <- match(foo, lookupDF$shortName) # 匹配到则取对应的longName,未匹配则保留原foo值 result_df <- ifelse(is.na(match_pos), foo, lookupDF$longName[match_pos]) result_df # 输出与plyr::revalue完全一致
内容的提问来源于stack exchange,提问作者user111024
相关产品推荐
相关产品推荐

