首页 > 解决方案 > 根据第一列中所述行的条目确定矩阵中每一行的长度

问题描述

这可能已经在某个地方得到了回答,但是由于我无法很好地描述我需要什么才能让它出现在谷歌上,所以我会尝试这种方式。

基本上我有一个专栏,这只是一个例子,我需要在更大的范围内完成它:

col <- c(2,5,4,3,4)

现在我想使用 cbind 创建一个矩阵,其中第一列是col. 然后使用 rnorm 填充该矩阵的行,但仅填充到第一列中输入的值的长度,即它应该看起来像这样。

> mat
  
2 rnorm rnorm NA    NA    NA
5 rnorm rnorm rnorm rnorm rnorm 
4 rnorm rnorm rnorm rnorm NA
3 rnorm rnorm rnorm NA    NA
4 rnorm rnorm rnorm rnorm NA

我知道如何使用 for 循环来实现这一点,但我想避免这些以保持低运行时间。提前致谢!

标签: rmatrix

解决方案


matrix这是从 的输出创建 a 的两种方法lapply,一种是 using rbind,另一种是 usingunlist

set.seed(7)

c1 <- c(2,5,4,3,4)

l1 <- lapply(c1,
             function(x, y) head(c(rnorm(x), rep(NA, y)), y),
             y = max(c1))

m1 <- matrix(unlist(l1),
             ncol = max(c1),
             byrow = TRUE)

m2 <- do.call(rbind, l1)

# set row names
rownames(m1) <- c1
rownames(m2) <- c1

        [,1]       [,2]       [,3]       [,4]      [,5]
2  2.2872472 -1.1967717         NA         NA        NA
5 -0.6942925 -0.4122930 -0.9706733 -0.9472799 0.7481393
4 -0.1169552  0.1526576  2.1899781  0.3569862        NA
3  2.7167518  2.2814519  0.3240205         NA        NA
4  1.8960671  0.4676805 -0.8938007 -0.3073283        NA

这也可以通过使用sapply. 但是,与上述相比,输出是转置的。可以使用t,但是如果矩阵很大,那会变得很昂贵。

m3 <- sapply(c1,
             function(x, y) head(c(rnorm(x), rep(NA, y)), y),
             y = max(c1))

colnames(m3) <- c1

matrix这是一个基于条件有条件地设置值的示例:

t1 <- 0.59

m1[m1 > t1] <- t1
m1[m1 < t1] <- 0

  [,1] [,2] [,3] [,4] [,5]
2 0.59 0.00   NA   NA   NA
5 0.00 0.00 0.00    0 0.59
4 0.00 0.00 0.59    0   NA
3 0.59 0.59 0.00   NA   NA
4 0.59 0.00 0.00    0   NA

推荐阅读