空行作为块数据分隔符
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
我有一个包含空行的单列数据集。每个空行定义一个新的数据块,即我将用 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
:
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