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

R.NET(C#)导入CSV后按Id排序报错‘object 'Id' not found’如何解决?

解决R.NET中排序时object 'Id' not found的问题

这个错误本质是R找不到你引用的Id对象——因为R是大小写敏感的,而且如果不明确指定数据框,它不知道Id属于哪份数据集。下面是一步步的解决方案:

1. 先确认列名是否正确读取

首先要排查的是:你的CSV文件里的表头确实是Id吗?有没有大小写错误(比如写成ID或者id),或者表头行有多余空格?

你可以在C#里添加这段代码,打印出DataIns的所有列名,确认列名是否和预期一致:

// 获取DataIns的列名并打印
var columnNames = engine.Evaluate("colnames(DataIns)").AsCharacter();
foreach (var name in columnNames)
{
    Console.WriteLine($"列名:{name}");
}

如果输出里没有Id,那说明read.table读取表头时出了问题,你可以调整read.table的参数,确保列名完全匹配原文件:

// 添加check.names=FALSE确保列名和原文件完全一致,stringsAsFactors避免自动转因子
DataFrame DataIns = engine.Evaluate(@"
DataIns<-read.table(
    'C:/Users/isalah/Desktop/Fichiers_CRM/Fichier_csv/Diagnostic.csv', 
    header=TRUE, 
    sep =';',
    fill = TRUE,
    stringsAsFactors=FALSE,
    check.names=FALSE
)").AsDataFrame();

2. 修改排序代码,明确指定数据框的列

你原来的with写法在纯R环境里没问题,但在R.NET的交互环境中,有时候会出现作用域识别的问题。最稳妥的方式是直接用DataIns$Id明确指定要排序的列:

// 直接指定DataIns$Id,避免作用域歧义
var sortedDataIns = engine.Evaluate("DataIns[order(DataIns$Id), ]").AsDataFrame();

如果你更习惯用with,可以先把排序后的结果赋值给R环境里的一个变量,再读取到C#中,这样能避免即时求值的作用域问题:

// 先在R环境中生成排序后的数据集
engine.Evaluate("sorted_DataIns <- DataIns[with(DataIns, order(Id)), ]");
// 再读取到C#的DataFrame中
var sortedDataIns = engine.Evaluate("sorted_DataIns").AsDataFrame();

3. 额外排查点

如果还是报错,你可以在R控制台中直接运行测试代码,确认逻辑是否正确:

DataIns<-read.table('C:/Users/isalah/Desktop/Fichiers_CRM/Fichier_csv/Diagnostic.csv', header=TRUE, sep =';',fill = TRUE)
colnames(DataIns) # 查看列名是否正确
order(DataIns$Id) # 测试能否生成排序索引
DataIns[order(DataIns$Id), ] # 测试排序是否正常

如果这段R代码能正常运行,那问题大概率出在R.NET的环境交互上,用上面的第二种方式(先赋值再读取)基本能解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:23:41