R语言-如何读取前n行数据
通常我们读取文件时都会读取全部的文件然后再进行操作,但是当读取的数据量很大是读取的时间会很长,而且占用ram,对于写测试代码有点不方便。
所以只读取前n行数据是一个挺不错的函数
##file:读取文件路径 ##n:读取的前n行 ##header:是否有标题行 readfile<-function(file, n=1000, header=t){ pt <- file(file, "r") name <- null if(header){ name <- strsplit(readlines(pt, 1), split=',')[[1]]; #读取标题 f1 <- readlines(pt, n) data <- read.table(text=f1, sep=',', col.names=name) }else{ data <- read.table(text=f1, sep=',') } close(pt) data }
测试,最近制作linux启动盘误将移动硬盘当u盘,要死要死的,近500g资料丢失,因为制成启动盘所以资料还找不回来。
所以没有大型数据做测试。
之前200m的文件本人电脑上读取前10000行也是秒读的。
(data <- readfile(file="mtcars.csv", n=5, header=t)) x.. x.mpg. x.cyl. x.disp. x.hp. x.drat. x.wt. 1 mazda rx4 21.0 6 160 110 3.90 2.620 2 mazda rx4 wag 21.0 6 160 110 3.90 2.875 3 datsun 710 22.8 4 108 93 3.85 2.320 4 hornet 4 drive 21.4 6 258 110 3.08 3.215 class(data) [1] "data.frame"
补充:r语言(数据读写操作)
本节介绍一些实用的数据处理函数(如行、列合并),以及如何从各种数据源读、写数据。
实用函数
函数 | 含义 |
---|---|
length() | 对象的长度。如 2 行 3 列的矩阵,其长度为 6。 |
dim() | 对象的维度。如 2 3 表示对象是二维的,有 2 行 3 列。 |
str() | 对象的结构。常用于查看数据框各列的数据类型、或者因子的分级数量。 |
class() | 对象的类。比如矩阵的返回结果是 matrix。 |
typeof() | 对象内数据的类型。比如矩阵的返回结果是 integer。 |
mode() | 对象的模式。比如矩阵会返回 numeric。 |
names() | 对象中各成分的名称。 |
cbind() | 按列合并多个对象。 |
rbind() | 按行合并多个对象。 |
objectname | 输出对象。 |
head() | 输出对象的前部,对于数据框而言是前6行。通过 head(obj, n) 来指定输出前 n 行。 |
tail() | 类似地,输出对象的后部。 |
ls(null) | 无参数函数。显示当前所有对象的名称列表。 |
rm() | 删除单个或多个对象。使用 rm(list = ls()) 可以删除除句点开头的隐藏对象外的所有对象。 |
一个 ls() 函数的例子:
a <- matrix(1:6, nrow=2, ncol=3)ls() # 目前的对象只有 a
‘a'
手动输入
使用需要赋值的 edit() 函数,或者无需写在赋值语句内的 fix() 函数。
dt <- data.frame(age = numeric(0), gender = character(0), weight = numeric(0))# dt <- edit(dt) # 需要自赋值# fix(dt) # 无需自赋值
遗憾的是,在 jupyter notebook 现行的版本中,尚且不支持 edit() 函数。不过用户可以使用 fix() 函数。
读取文件
关于怎样读取来自 url 地址的网络文件,r 可以实现,但这里不做讨论。以下只讨论本地数据源的读写。
分隔符文件
利用 read.table() 函数即可。其常用的参数有:
read.table(file, [header=t/f, sep=" ", row.names=, col.names=, na.strings=, colclasses=, quote=, skip=, stringasfactors=t/f,])
其中,可选参数的含义大多较好理解:
header 表示文件首行是否是列名而不是数据;
sep 是列间分隔符;na.strings 指定一个字符向量,内部所有的元素在读取时会被转换为 na;
colclasses 用于指派各列的类型,如 =c(“numeric”, “character”, “null”) 指定了前两列的类型并跳过了第三列;
skip 用于跳过文件的最开始的若干行;
stringasfactors 为 true(默认值)时表示字符向量按因子处理,设为 false 可以提升大文本处理速度。
data.path <- paste(getwd(), '/data/iris.data.csv', sep='')dt <- read.table(data.path, header=t, sep=",")head(dt)
x5.1 | x3.5 | x1.4 | x0.2 | iris.setosa |
---|---|---|---|---|
4.9 | 3.0 | 1.4 | 0.2 | iris-setosa |
4.7 | 3.2 | 1.3 | 0.2 | iris-setosa |
4.6 | 3.1 | 1.5 | 0.2 | iris-setosa |
5.0 | 3.6 | 1.4 | 0.2 | iris-setosa |
5.4 | 3.9 | 1.7 | 0.4 | iris-setosa |
4.6 | 3.4 | 1.4 | 0.3 | iris-setosa |
# 利用 str() 函数查看其信息str(dt)
'data.frame': 149 obs. of 5 variables: $ x5.1 : num 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 5.4 ... $ x3.5 : num 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 3.7 ... $ x1.4 : num 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 1.5 ... $ x0.2 : num 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 0.2 ... $ iris.setosa: factor w/ 3 levels "iris-setosa",..: 1 1 1 1 1 1 1 1 1 1 ...
须知:
如果列名中包含空格,r 会将空格替换为句点。
多数情况下,stringasfactors 可以设为 false。但是本例中的字符变量表示植物的种类,此处读成因子是正确的。
函数 read.csv() 能够读取 csv 文件,但是功能不如 read.table() —— 后者能处理非 csv 文本。
处理 excel 文件
读取一个 excel 文件最佳的方式,是预先将其转为 csv 格式,并用上述的 read.table() 方法读取。
你也可以查找关于 xlsx 包的相关内容,来获知如何直接操作 xlsx 文件。此处略过不提。
可以看一下以前写的文章:
统计软件数据:sas/spss/stata
需要用到 foreign 包。
sas:使用 read.ssd()。如果你安装了 sas,可以使用 hmisc 包的 sas.get()。
spss:使用 read.spss(),或者 hmisc 包的 spss.get()。
stata:使用 read.data()。
数据库
一个方法是使用 odbc 接口。针对你的数据库类型,安装 odbc 驱动;然后在 r 中安装 rodbc 包。
另一个方法是使用 jdbc 接口,只不过需要 rjdbc 包。
写入文件
在我们对于数据进行清洗之后,往往需要把清洗结果输出到一个新文件中。这里就以 csv 格式为例吧。一个通常的 write.table()/write.csv() 的例子:
write.csv(dt, "filename.csv", row.names=f)
其中 row.names 指定为 false,否则第一列会生成行号一样的数据。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
上一篇: “促织皇帝”朱瞻基,他的一生有哪些成就?
下一篇: 用canvas显示验证码的实现