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

R代码异常:匹配DataFrame行时which()返回integer(0)求排查修正

问题原因

你用apply(df1, 1, identical, row_df)得不到匹配结果,核心原因是类型不匹配:

  • apply(df1, 1, ...)会把df1的每一行转换成向量输出
  • row_df是单行数据框,identical是严格比较函数,会判断向量和数据框是不同类型,因此永远返回FALSE,最终which只能得到空的integer(0)。
修正方案

以下是几种可行的解决方法,按需选择:

方法1:将row_df转为向量后比较

把row_df转换成和apply输出的行同类型的向量,再用identical匹配:

# 把单行数据框转为带列名的向量,和apply输出的行向量结构一致
matching_row_index <- which(apply(df1, 1, identical, unlist(row_df)))

注意:如果数据框包含因子列,需要确保df1和row_df的因子水平完全一致,否则可能匹配失败。

方法2:逐列匹配(更稳健,支持NA)

这种方法能处理数值类型兼容(比如整数和数值)、NA值匹配的场景,适用性更广:

# 生成每列的匹配逻辑:值相等,或者同时为NA
match_cols <- sapply(names(df1), function(col) {
  df1[[col]] == row_df[[col]] | (is.na(df1[[col]]) & is.na(row_df[[col]]))
})
# 找到所有列都匹配的行索引
matching_row_index <- which(rowSums(match_cols) == ncol(df1))

方法3:合并后找重复行

利用duplicated函数快速定位重复行,代码最简洁:

# 合并row_df和df1,找df1中与row_df重复的行
combined_df <- rbind(row_df, df1)
# duplicated标记的是合并后重复的行,减1得到df1中的原始索引
matching_row_index <- which(duplicated(combined_df)) - 1

内容的提问来源于stack exchange,提问作者user22354047

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:22:33