在R中逐行阅读的好方法是什么?

我有一个文件,其中每行是一组实验收集的结果。 每个实验的结果数量(即每行的列数)可能不同。 对每行结果的顺序也没有什么重要性(第1行的第一个结果和第一个结果2没有任何其他对的相关性;这些结果集合 )。

该文件看起来像这样:

2141 0 5328 5180 357 5335 1 5453 5325 5226 7 4880 5486 0 2650 0 5280 4980 5243 5301 4244 5106 5228 5068 5448 3915 4971 5585 4818 4388 5497 4914 5364 4849 4820 4370 2069 2595 2478 4941 2627 3319 5192 5106 32 4666 3999 5503 5085 4855 4135 4383 4770 2005 2117 2803 2722 2281 2248 2580 2697 2897 4417 4094 4722 5138 5004 4551 5758 5468 17361 1914 1977 2414 100 2711 2171 3041 5561 4870 4281 4691 4461 5298 3849 5166 5578 5520 4634 4836 4905 5105 5089 2539 2326 0 4617 3735 0 5122 5439 5238 1 25 5316 21173 4492 5038 5944 5576 5424 5139 5184 5 5096 4963 2771 2808 2592 2 4963 9428 17152 5467 5202 6038 5094 5221 5469 5079 3753 5080 5141 4097 5173 11338 4693 5273 5283 5110 4503 51 2024 2 2822 5097 5239 5296 4561 

除了每一行更长(高达几千个值)。 可以看出,所有的值都是非负整数。

简而言之 – 这不是一个普通的表,其中的列有含义。 它只是一堆结果 – 每个排成一列。

我想读取所有的结果,然后对每个实验(行)做一些操作,比如计算ecdf。 我也想计算所有重复的平均ecdf。

我的问题 – 我应该如何阅读这个奇怪的文件? 我很read.table ,我不知道我曾经尝试过其他任何东西…我是否必须使用一些低级别的readlines ? 我猜首选输出将是一个列表(或向量?)的向量。 我看了scan但似乎所有的载体必须在那里长度相同。

任何build议将不胜感激。

更新按照下面的build议,我现在做这样的事情:

 con <- file('myfile') open(con); results.list <- list(); current.line <- 1 while (length(line <- readLines(con, n = 1, warn = FALSE)) > 0) { results.list[[current.line]] <- as.integer(unlist(strsplit(line, split=" "))) current.line <- current.line + 1 } close(con) 

似乎工作。 它看起来好吗?

当我summary(results.list)我得到:长度类模式

  Length Class Mode [1,] 1091 -none- numeric [2,] 1070 -none- numeric .... 

class上不应该是整数吗? 这是什么模式?

Josh链接的例子是我一直使用的。

 inputFile <- "/home/jal/myFile.txt" con <- file(inputFile, open = "r") dataList <- list() ecdfList <- list() while (length(oneLine <- readLines(con, n = 1, warn = FALSE)) > 0) { myVector <- (strsplit(oneLine, " ")) myVector <- list(as.numeric(myVector[[1]])) dataList <- c(dataList,myVector) myEcdf <- ecdf(myVector[[1]]) ecdfList <- c(ecdfList,myEcdf) } close(con) 

我编辑了示例,从示例数据创build两个列表。 dataList是一个列表,其中列表中的每个项目是文本文件中每行的数值的向量。 ecdfList是一个列表,其中每个元素是文本文件中每行的ecdf。

你可能应该在那里添加一些try()或trycatch()逻辑,以正确处理由于空值或某些原因而无法创buildecdf的情况。 但上面的例子应该让你非常接近。 祝你好运!

是的,你可以使用readLines 。 JD Long有一个很好的例子 ,我稍微编辑了一下 ,并在下面提供。

 con <- file(inputFile, open = "r") while (length(oneLine <- readLines(con, n = 1, warn = FALSE)) > 0) { # do stuff } close(con) 

为什么打扰逐行阅读?

 results.list <- lapply(strsplit(readLines("myfile")," "), as.integer) 

给你整数向量列表。

关于你的附加问题:看看?mode (简而言之 – mode是数字的数字, typeof可以是整数或双typeofclass精度或整数)。 要查看是否有整数检查str(results.list)lapply(results.list, class)

要么:

 df <- read.delim(file="whatever", header=F, sep = " ") 

使用

 line <- readLines(con, 1) 

从连接con读取一行,可以像con <- file(filename, "r")那样简单。

如果您知道文件中的值是整数,则可以使用scan()而不是readLines() ,但也可以在循环中使用:

 open(con) results.list <- list(); current.line <- 1 while( length(line <- scan(con,what=integer(0),nlines=1,quiet=TRUE))>0 ) { results.list[[current.line]] <- line current.line <- current.line + 1 } close(con) 

你会得到一个数字向量列表。