空行作为块数据分隔符

Blank line as block-data separator

我有一个包含空行的单列数据集。每个空行定义一个新的数据块,即我将用 gnuplot 绘制的内容(如果空行加倍),如下所示:

plot "datafile" i n

其中 n 是第 n 个块。

我如何在 R 中实现数据导入,以便我可以创建例如一个双索引矩阵,其中第一个索引是行索引,第二个是块索引? (另外,行数始终相同)

试试这个例子:

#dummy data
m <- matrix(c(runif(3),NA,runif(2),NA,runif(2),NA,runif(3)),ncol=1)
m
#            [,1]
# [1,] 0.66061405
# [2,] 0.52066742
# [3,] 0.65503125
# [4,]         NA
# [5,] 0.80940612
# [6,] 0.04561362
# [7,]         NA
# [8,] 0.56771139
# [9,] 0.12002132
# [10,]         NA
# [11,] 0.32809536
# [12,] 0.45677662
# [13,] 0.97538827
#index of intervals
ix <- c(0,which(is.na(m[,1])),nrow(m))

#assign blocks
m <- cbind(m,rep(1:length(diff(ix)),diff(ix)))

#exclude blank rows
m[ !is.na(m[,1]), ]
#            [,1] [,2]
# [1,] 0.54458424    1
# [2,] 0.99712258    1
# [3,] 0.21064432    1
# [4,] 0.38194407    2
# [5,] 0.78414814    2
# [6,] 0.95007031    3
# [7,] 0.09169785    3
# [8,] 0.03803962    4
# [9,] 0.78180826    4
# [10,] 0.40222317    4

使用@zx8754 的示例数据...

set.seed(1)
m <- matrix(c(runif(3),NA,runif(2),NA,runif(2),NA,runif(3)),ncol=1)

我们可以用 cumsum:

使他的结果的第二列 table
cbind(m,1L+cumsum(is.na(m)))[!is.na(m),]

这给出了

            [,1] [,2]
 [1,] 0.26550866    1
 [2,] 0.37212390    1
 [3,] 0.57285336    1
 [4,] 0.90820779    2
 [5,] 0.20168193    2
 [6,] 0.89838968    3
 [7,] 0.94467527    3
 [8,] 0.66079779    4
 [9,] 0.62911404    4
[10,] 0.06178627    4