如何根据输入数字字符串在DataFrame的lhs列匹配并返回对应列值
解决R中DataFrame多数字无序匹配lhs列的问题
首先,我们先定义你提供的DataFrame,方便后续测试:
df <- data.frame( lhs = c("32,39,6", "39,6,65", "14,16,26", "16,20,4", "16,26,33", "53"), rhs = c(65, 32, 15, 26, 4, 31), name = c("jackfruit", "coffee", "salts", "marshmallows", "veggies", "candy"), stringsAsFactors = FALSE )
问题分析
你之前使用grep的方式是按连续子串匹配,这就要求输入的数字顺序和lhs中的顺序完全一致且连续才能命中(比如grep('16,20', df$lhs)能匹配16,20,4,但grep('16,4', df$lhs)不行,因为lhs里是16,20,4,没有16,4这个连续子串)。但你的实际需求是:输入的所有数字都存在于lhs的数字集合中(不管顺序和中间是否有其他数字),所以需要换一种匹配逻辑。
解决方案
我们可以写一个自定义函数,将输入字符串和lhs列都拆分为独立数字集合,然后检查输入的所有数字是否都包含在该行的lhs数字中:
match_lhs <- function(input_str, df) { # 把输入字符串拆转为整数集合 input_nums <- as.integer(strsplit(input_str, ",")[[1]]) # 遍历每一行的lhs,检查输入数字是否全部存在于该行的lhs数字中 is_match <- sapply(df$lhs, function(lhs_str) { lhs_nums <- as.integer(strsplit(lhs_str, ",")[[1]]) all(input_nums %in% lhs_nums) }) # 返回匹配行的rhs和name列 df[is_match, c("rhs", "name")] }
测试示例
示例1:输入"14,16"
match_lhs("14,16", df)
输出:
rhs name 3 15 salts
示例2:输入"14,16,26"
match_lhs("14,16,26", df)
输出:
rhs name 3 15 salts
示例3:输入"16"
match_lhs("16", df)
输出:
rhs name 3 15 salts 4 26 marshmallows 5 4 veggies
你的测试用例:输入"16,4"
match_lhs("16,4", df)
输出:
rhs name 4 26 marshmallows
完全符合你的期望!
内容的提问来源于stack exchange,提问作者pylearner
相关产品推荐
相关产品推荐

