R从文件中读取数据,输出文件

本文介绍了如何使用R语言中的read.table函数进行数据导入,并详细解释了处理不同格式数据时的各种参数配置,帮助读者掌握R语言数据处理的基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看了几天的书,终于到这一步了,说实话,用R来做统计,很少有人手动的去输入那些数字,肯定是从别的地方导入的,我们用来处理就可以了,所以到这里才算是真正的入门,前面都是做基础的练手。

我学习R从《R语言与统计分析》入手,第一个例子,从书上的例子,入手,为大家能够快速入门。

在F盘下有个r文件夹,里面有个foo.txt的文件,

文件的内容如下:

treat   weight

A          3.4

B          NA

C          5.8

操作命令如下:

>foo<-read.table(file="f:/r/foo.txt",header=T)
>foo

输出结果如下:

      at weight
1     A    3.4
2     B     NA
3     A    5.8

当然我们在经过一系列的处理以后,需要将其保存起来,我们接着来看保存的命令。

1:保存为简单的文本

>write.table(name,file="d:/r/foo.txt",row.names=F,quote=F)

这里rownames表示行名为False也就是不写入文件,quote引号的意思,=F也是不写入的意思。


2.保存为csv文件

>write.csv(d,file="c:/data/foo.csv",row.names=F,quote=F)


3.保存为R格式

save(d,file="f:/r/fool.Rdata")


下面是一个非常像详细的解释:

http://www.cnblogs.com/xianghang123/archive/2012/06/06/2538274.html

【R】数据导入读取read.table函数详解,如何读取不规则的数据(fill=T)

函数 read.table 是读取矩形格子状数据最为便利的方式。因为实际可能遇到的情况比较多,所以预设了一些函数。这些函数调用了 read.table 但改变了它的一些默认参数。

注意,read.table 不是一种有效地读大数值矩阵的方法:见下面的 scan 函数。

一些需要考虑到问题是:

  1. 编码问题

    如果文件中包含非-ASCII字符字段,要确保以正确的编码方式读取。这是在UTF-8的本地系统里面读取Latin-1文件的一个主要问题。此时,可以如下处理

              read.table(file("file.dat", encoding="latin1"))
         

    注意,这在任何可以呈现Latin-1名字的本地系统里面运行。

  2. 首行问题

    我们建议你明确地设定 header 参数。按照惯例,首行只有对应列的字段而没有行标签对应的字段。因此,它会比余下的行少一个字段。(如果需要在 R 里面看到这一行,设置 header = TRUE。)如果要读取的文件里面有行标签的头字段(可能是空的),以下面的方式读取

              read.table("file.dat", header = TRUE, row.names = 1)
         

    列名字可以通过 col.names 显式地设定;显式设定的名字会替换首行里面的列名字(如果存在的话)。

  3. 分隔符问题

    通常,打开文件看一下就可以确定文件所使用的字段分隔符,但对于空白分割的文件,可以选择默认的sep = "" (它能使用任何空白符作为分隔符,比如空格,制表符,换行符), sep = " " 或者 sep = "\t"。注意,分隔符的选择会影响输入的被引用的字符串。

    如果你有含有空字段的制表符分割的文件,一定要使用 sep = "\t"

  4. 引用 默认情况下,字符串可以被 " 或 ' 括起,并且两种情况下,引号内部的字符都作为字符串的一部分。有效的引用字符(可能没有)的设置由参数 quote 控制。对于sep = "\n",默认值改为 quote = ""

    如果没有设定分隔字符,在被引号括起的字符串里面,引号需要用 C格式的逃逸方式逃逸,即在引号前面直接加反斜杠 \

    如果设定了分隔符,在被引号括起的字符串里面,按照电子表格的习惯,把引号重复两次以达到逃逸的效果。例如

              'One string isn''t two',"one more"
         

    可以被下面的命令读取

              read.table("testfile", sep = ",")
         

    这在默认分隔符的文件里面不起作用。

  5. 缺损值 默认情况下,文件是假定用 NA 表示缺损值,但是,这可以通过参数 na.strings 改变。参数 na.strings 是一个可以包括一个或多个缺损值得字符描述方式的向量。

    数值列的空字段也被看作是缺损值。

    在数值列,值 NaNInf 和 -Inf 都可以被接受的。

  6. 尾部空字段省略的行

    从一个电子表格中导出的文件通常会把拖尾的空字段(包括?堑姆指舴? 忽略掉。为了读取这样的文件,必须设置参数 fill = TRUE

  7. 字符字段中的空白

    如果设定了分隔符,字符字段起始和收尾处的空白会作为字段一部分看待的。为了去掉这些空白,可以使用参数 strip.white = TRUE

  8. 空白行

    默认情况下,read.table 忽略空白行。这可以通过设置 blank.lines.skip = FALSE 来改变。但这个参数只有在和 fill = TRUE 共同使用时才有效。这时,可能是用空白行表明规则数据中的缺损样本。

  9. 变量的类型

    除非你采取特别的行动,read.table 将会为数据框的每个变量选择一个合适的类型。如果字段没有缺损以及不能直接转换,它会按 logical, integer, numeric 和 complex 的顺序依次判断字段类型。如果所有这些类型都失败了,变量会转变成因子。

    参数 colClasses 和 as.is 提供了很大的控制权。 as.is 会 抑制字符向量转换成因子(仅仅这个功能)。 colClasses运行为输入中的每个列设置需要的类型。

    注意,colClasses 和 as.is 对 列专用,而不是个变量。因此,它对行标签列也同样适用(如果有的话)。

  10. 注释

    默认情况下,read.table 用 # 作为注释标识字符。如果碰到该字符(除了在被引用的字符串内),该行中随后的内容将会被忽略。只含有空白和注释的行被当作空白行。

    如果确认数据文件中没有注释内容,用 comment.char = "" 会比较安全 (也可能让速度比较快)。

  11. 逃逸

    许多操作系统有在文本文件中用反斜杠作为逃逸标识字符的习惯,但是Windows系统是个例外(在路径名中使用反斜杠)。在 R 里面,用户可以自行设定这种习惯是否用于数据文件。

    read.table 和 scan 都有一个逻辑参数 allowEscapes。从 R 2.2.0 开始,该参数默认为否,而且反斜杠是唯一被解释为逃逸引用符的字符(在前面描述的环境中)。如果该参数设为是,以C形式的逃逸规则解释,也就是控制符如 \a, \b, \f, \n, \r, \t, \v,八进制和十六进制如 \040 和 \0x2A 一样描述。任何其它逃逸字符都看着是自己,包括反斜杠。

常用函数 read.csv 和 read.delim 为 read.table 设定参数以符合英语语系本地系统中电子表格导出的CSV和制表符分割的文件。这两个函数对应的变种 read.csv2 和 read.delim2 是针对在逗号作为小数点的国家使用时设计的。

如果 read.table 的可选项设置不正确,错误信息通常以下面的形式显示

     Error in scan(file = file, what = what, sep = sep, :
             line 1 did not have 5 elements

或者

     Error in read.table("files.dat", header = TRUE) :
             more columns than column names

这些信息可能足以找到问题所在,但是辅助函数 count.fields 可以进一步的深入研究问题所在。

读大的数据格子(data grid)时,效率最重要。设定 comment.char = "",以原子向量类型(逻辑型,整型,数值型,复数型,字符型或原味型)设置每列的 colClasses ,给定需要读入的行数 nrows (适当地高估一点比不设置这个参数好)等措施会提高效率。

 

  




<think>好的,我现在需要回答用户关于如何在C语言中从文件读写数据的问题。首先,我应该回忆一下C语言文件操作的基本知识,确保自己记得正确。用户可能对文件操作不太熟悉,所以需要从基础讲起,分步骤解释,并且给出例子,这样更容易理解。 首先,C语言中文件操作主要使用标准库中的函数,比如fopen、fclose、fprintf、fscanf、fgets、fputc等等。我应该先介绍文件指针的概念,因为这是操作文件的关键。FILE结构体指针,用户需要知道如何声明和使用它。 接下来是打开文件的函数fopen,需要说明它的两个参数:文件名和打开模式。比如“r”是只读,“w”是写入,如果文件存在则清空,不存在则创建,“a”是追加等等。这里要注意不同模式的区别,特别是写模式会覆盖原有内容,而追加模式是在末尾添加。可能用户容易混淆这些模式,需要明确说明。 然后,需要检查fopen是否成功,因为如果文件打开失败,比如文件不存在或者没有权限,会导致后续操作出错。这时候应该提示用户使用错误处理,比如判断返回的指针是否为NULL,并输出错误信息。 接下来是读写数据的具体方法。这里需要分文本文件和二进制文件的处理。用户可能想知道如何读写不同的数据类型,比如字符串、整数、结构体等。对于文本文件,常用的函数是fprintf和fscanf,类似于printf和scanf,但需要指定文件指针。而二进制文件则用fread和fwrite,这两个函数处理的是内存块,适合结构体等数据。 在读写过程中,还要注意每次操作后的错误检查,比如ferror函数,或者检查返回值是否符合预期。例如,fwrite返回成功写入的元素数目,如果和预期不符,可能发生了错误。 最后,关闭文件非常重要,使用fclose函数,这样可以确保缓冲区的内容被正确写入文件,避免数据丢失。同时,关闭文件后,文件指针不应该再被使用,否则可能导致未定义行为。 可能用户还关心具体的例子,所以给出一个读写文本文件和二进制文件的示例代码会很有帮助。比如,用fprintf写入一个整数和一个字符串,然后用fscanf读取回来。对于二进制文件,比如保存一个结构体,使用fwrite写入,再用fread读取。注意结构体内存对齐的问题,但可能在基础教程中不需要深入讨论,保持简单即可。 另外,需要提醒用户注意文件路径的问题,相对路径和绝对路径的区别,尤其是在不同操作系统下的斜杠方向不同,比如Windows用反斜杠,而Linux用正斜杠,但在C字符串中需要转义,或者使用双反斜杠。 还要提到的是,读写时的格式字符串必须匹配,否则会导致读取错误或者不可预知的结果。比如用fprintf写入了"%d %s",那么用fscanf读取时也要用同样的格式,否则数据可能错乱。 最后,总结一下步骤:打开文件、检查是否成功、读写操作、错误处理、关闭文件。这样用户能有一个清晰的流程概念。 可能用户会犯的错误包括忘记关闭文件、没有检查文件打开是否成功、读写模式选择错误导致数据被覆盖,或者在文本模式和二进制模式处理数据时的混淆。所以需要在这些地方特别强调注意事项。 现在整理这些思路,组织成结构清晰的步骤,并给出示例代码,确保语法正确,同时用中文自然表达,避免专业术语堆砌,让用户容易理解。</think>在C语言中,文件读写主要通过标准库函数实现。以下是详细步骤和示例: --- ### 一、文件操作基本步骤 1. **打开文件**:`fopen()` 2. **读写操作**:选择文本或二进制模式 3. **关闭文件**:`fclose()` --- ### 二、核心函数说明 #### 1. 打开文件 ```c FILE *fopen(const char *filename, const char *mode); ``` - **常用模式**: - `"r"`:只读(文件必须存在) - `"w"`:写入(覆盖原有内容,若文件不存在则创建) - `"a"`:追加(在文件末尾添加) - `"rb"`/`"wb"`:二进制模式读写 #### 2. 关闭文件 ```c int fclose(FILE *stream); ``` --- ### 三、文本文件读写示例 #### 1. 写入文本文件 ```c #include <stdio.h> int main() { FILE *file = fopen("test.txt", "w"); if (file == NULL) { printf("文件打开失败!"); return 1; } int num = 100; char str[] = "Hello, World!"; // 使用fprintf写入格式化数据 fprintf(file, "%d\n%s", num, str); fclose(file); return 0; } ``` #### 2. 读取文本文件 ```c #include <stdio.h> int main() { FILE *file = fopen("test.txt", "r"); if (file == NULL) { printf("文件打开失败!"); return 1; } int num; char str[50]; // 使用fscanf读取格式化数据 fscanf(file, "%d", &num); fscanf(file, "%s", str); printf("数字: %d\n字符串: %s\n", num, str); fclose(file); return 0; } ``` --- ### 四、二进制文件读写示例 #### 1. 写入二进制文件 ```c #include <stdio.h> struct Student { int id; char name[20]; }; int main() { FILE *file = fopen("data.bin", "wb"); if (file == NULL) { printf("文件打开失败!"); return 1; } struct Student s = {1, "Alice"}; // 使用fwrite写入二进制数据 fwrite(&s, sizeof(struct Student), 1, file); fclose(file); return 0; } ``` #### 2. 读取二进制文件 ```c #include <stdio.h> struct Student { int id; char name[20]; }; int main() { FILE *file = fopen("data.bin", "rb"); if (file == NULL) { printf("文件打开失败!"); return 1; } struct Student s; // 使用fread读取二进制数据 fread(&s, sizeof(struct Student), 1, file); printf("学号: %d\n姓名: %s\n", s.id, s.name); fclose(file); return 0; } ``` --- ### 五、注意事项 1. **错误检查**:每次文件操作后检查返回值(如`fopen`是否返回`NULL`)。 2. **模式选择**:区分文本和二进制模式(尤其是Windows系统)。 3. **缓冲区刷新**:关闭文件前确保数据已写入(`fflush(file)`可强制刷新)。 4. **路径问题**:使用相对路径(如`"data/file.txt"`)或绝对路径(如`"/home/user/file.txt"`)。 通过以上方法,你可以在C语言中高效地实现文件读写操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值