如何使用read.csv()在R中导入最后100行数据

12

您好,我有一个巨大的文件,想仅导入该文件的最后100行。如何使用read.csv()或其他替代方式实现?


如果你关心速度,那么可以尝试使用"data.table"中的fread函数,然后只提取你需要的行。同样地,你也可以使用sqldf函数。如果你在Unix系统上,你可以使用tail命令来提高效率。 - A5C1D2H2I1M1N2O1R2T1
1
我知道我们可以使用特定于操作系统的命令,但我正在寻找R本身的解决方法! - Prasun Velayudhan
7个回答

23

包R.utils中有一个名为countLines()的函数。你可以这样写:

l2keep <- 10
nL <- countLines("your.csv")
df <- read.csv("your.csv", header=FALSE, skip=nL-l2keep)

3

如果你使用的是*nix系统,最好使用tail -n 100命令来查看最后100行。如果使用R实现,处理大文件时速度会变慢,而且可能会非常慢。

如果你使用的是Windows系统,可以参考这个SO问题


是的,没错。那么你的意思是使用一些Windows函数来获取最后100行并将其放入文件中,然后再导入到R中? - Prasun Velayudhan
基本上可以这么说。在R中,您可以使用seek()和其他“花哨”的功能,但是要找到与之一样快或简单的东西就需要好运了。 - ktdrv

2
如果您想包含标题,可以改进@lauratboyer的答案:
# read headers only
column_names <- as.vector(t(read.csv("your.csv", header=FALSE, colClasses='character', nrows=1)))

# then last n lines
l2keep <- 10
nL <- R.utils::countLines("your.csv")
df <- read.csv("your.csv", header=FALSE, col.names=column_names, skip=nL-l2keep)

1
你可以使用read.csv中的nrowsskip参数。例如,如果你有一个包含10000行的文件,并且只想导入最后100行,可以尝试以下方法:
read.csv("yourfile.csv",nrows=100,skip=9900)

但如果你需要速度,也许最好使用@Ananda Mahto和@ktdrv提供的解决方案。


谢谢回复。但问题是我的文件大小非常巨大,以至于我无法确定总行记录数。 - Prasun Velayudhan

0

读取文件,使用tail函数 a<-read.csv('c:/..') tail(a,100L)


0

对我而言,快速且有效的方法是使用fread读取大文件,同时设置select = 1以仅读取第一列。然后再次使用fread从所需行中读取数据。freadread.csv或其他类似变体要快得多。有关freadread.csv的更多信息,请参见此处:Reason behind speed of fread in data.table package in R


-2

在read.csv()中给出适当的skip参数


1
这并没有回答提问者的问题。他们想要从文件中仅读取最后100行。你的回答假设数据集已经被读取。 - Ben Bolker
这个回复毫无意义,只是对 @Rob 回复(第一个回复)的拙劣抄袭。值得一提的是,我并不是在批评 Rob 的回答,而只是对 B K 的回复提出质疑。 - Bruce_Warrior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接