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
相关产品推荐
相关产品推荐

