在R中使用combn函数时如何保留数据框的非数值列?
解决保留字符列的目标和行提取问题
我明白你的痛点了——之前的代码只盯着val列的数值组合,没法关联回原数据里的Doc和Category,遇到重复值还容易匹配错。其实核心思路应该是用行索引来关联组合,而不是直接用数值,这样就能精准找回对应的整行数据了。
具体实现步骤
我们直接基于原数据框的行索引生成组合,计算对应索引的val和,找到符合目标的组合后再提取整行:
# 先定义你的原数据框(示例) df <- data.frame( Doc = c("A", "B", "C", "D"), Category = c("aa", "ab", "ab", "cc"), val = c(1, 6, 3, 6), stringsAsFactors = FALSE ) # 设置目标和 target_sum <- 7 # 生成所有行索引的组合(从1行到总行数的所有可能组合) all_index_combs <- Map(combn, list(1:nrow(df)), seq_along(df$val), simplify = FALSE) all_index_combs <- unlist(all_index_combs, recursive = FALSE) # 筛选出第一个val和等于目标值的索引组合 matched_indices <- Filter(function(idx) sum(df$val[idx]) == target_sum, all_index_combs)[[1]] # 提取对应的整行数据 result <- df[matched_indices, ] print(result)
运行后就能得到你想要的输出:
Doc Category val 1 A aa 1 2 B ab 6
优化建议
如果你的目标是找固定行数的组合(比如例子里的2行),可以直接生成指定行数的索引组合,这样能大幅减少计算量,效率更高:
# 只生成2行的索引组合 all_index_combs <- combn(1:nrow(df), 2, simplify = FALSE)
这种方法的好处是:不管val列有没有重复值,行索引都是唯一对应原数据的行的,完全不会出现匹配错误,而且直接提取整行,自然保留了所有列的信息。
内容的提问来源于stack exchange,提问作者CJJ
相关产品推荐
相关产品推荐

