You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据输入数字字符串在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:15:06