如何获得我想要的行并将它们组合在一起?

时间:2017-03-19 19:54:06

标签: r

我的矩阵看起来像这样:

enter image description here

实际上,我每天和每小时输出一周,这意味着我每天有7个矩阵,每小时有168个矩阵。

我想要的输出是:

1:获取每个矩阵的整行,第三列的第一个值大于99.

例如:

[8,]    8,   3.5959768,   99.10497,  794880

2:从第二列的第一个值小于1的每个矩阵中获取整行。

例如:

[14,]   14,   0.7453416,   94.40994,  198720

3:需要从每个矩阵中捕获两行。

最后,我需要将从所有矩阵中捕获的所有行合并为一个。所以,对于每天我们应该有14行,每小时我们应该有336行。

1 个答案:

答案 0 :(得分:1)

通过以文本格式提供数据(作为打印矩阵的副本或dput的输出),您的问题将得到改善。

如果没有,那么这里有一些样本数据:

set.seed(123)
matrices <- replicate(7,
  cbind(1:21, rnorm(21, 2, 1), rnorm(21, 99, 3), rnorm(21, 1e5, 1e5)),
  simplify = FALSE)

您可以按照以下方式执行以下操作:

get_rows <- function(mat) {
  rbind(mat[which(mat[, 3] > 99)[1], , drop = FALSE],
    mat[which(mat[, 2] < 1)[1], , drop = FALSE])
}
desired_row_list <- lapply(matrices, get_rows)
desired_rows <- do.call("rbind", desired_row_list)

使用指定的条件对每个矩阵进行子集设置,始终只返回第一行以满足这些条件。然后它将它们全部连接成一个带有rbind的矩阵。

desired_rows
#      [,1]        [,2]      [,3]      [,4]
# [1,]    6  3.71506499 101.51336  53334.46
# [2,]    8  0.73493877  95.58559  91663.09
# [3,]    2  0.92820877  99.99535  21509.55
# [4,]    1  0.98142462  98.33854  95497.23
# [5,]    1  2.23538657 101.06375 151686.20
# [6,]    9 -0.05324722  98.15881 103778.84
# [7,]    1  1.50070798  99.35774  90968.04
# [8,]    6  0.68919847 104.02709  81707.46
# [9,]    2  2.09049665 101.54893 106670.09
# [10,]    8  0.46709800  93.99757  24731.10
# [11,]    3  0.74135137 101.59734 357145.81
# [12,]    3  0.74135137 101.59734 357145.81
# [13,]    6  0.94498296 101.01209  54966.14
# [14,]    2  0.20971876  98.77933 128642.44