仅从R中的.csv文件导入每第N行

Tom*_*m A 9 csv import text r

只是一个简单的问题.有没有办法使用read.csv从大文件导入每个第N行:

例如,一个50-60万行文件,你只需要从第2行开始的每第4行.

我想过可能会加入'seq'功能,但我不确定这是否可行.

有什么建议?

小智 14

对于大型数据文件,最好的选择是在将不必要的行导入R之前将其过滤掉.最简单的方法是通过OS命令,如sed,awk,grep等.以下代码每4次读取一次文件中的行:例如:

write.csv(1:1000, file='test.csv')

file.pipe <- pipe("awk 'BEGIN{i=0}{i++;if (i%4==0) print $1}' < test.csv ")
res <- read.csv(file.pipe)
res

> res
     X3 X3.1
1     7    7
2    11   11
3    15   15
4    19   19
5    23   23
6    27   27
7    31   31
8    35   35
Run Code Online (Sandbox Code Playgroud)


Sve*_*ein 5

read.csv("filename.csv")[c(FALSE, TRUE, FALSE, FALSE), ]
Run Code Online (Sandbox Code Playgroud)

会做的.

这是有效的,因为逻辑向量被循环使用,直到它匹配返回的数据帧的行数read.csv.

  • 请注意,这会将整个文件读入内存并将其转换为数据框,然后丢弃您不想要的四分之三数据.对于中等大小的文件,这是一个很好的方法,但是如果你这样做是因为文件太大而无法放入内存中,那么这个方法将不起作用. (6认同)

Sco*_*hie 5

正如@df239 所建议的那样,使用命令行工具预先过滤行要好得多。

这是一个更简单的版本,使用sed

df <- read.csv(pipe("sed -n '2~4p' test.csv")) 
Run Code Online (Sandbox Code Playgroud)

2~4p通知sed让每一个第4行,开始第2行。

  • 所以我尝试了这个并得到以下错误:错误 in read.table(file = file, header = header, sep = sep, quote = quote, : no lines available in input (2认同)