【问题标题】:Determing length of each row in a matrix based on entry of said row in first column根据第一列中所述行的条目确定矩阵中每一行的长度
【发布时间】:2021-05-04 22:39:20
【问题描述】:

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

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

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 循环来实现这一点,但我想避免这些以保持运行时间较短。提前致谢!

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    这里有两种方法可以从lapply 的输出创建matrix,一种使用rbind,另一种使用unlist

    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
    

    【讨论】:

    • 非常感谢!不过,快速跟进问题。我还需要将此矩阵中高于阈值的值设置为所述阈值并在另一种条件下等于零。这很容易融入功能吗?
    • @LuukS 用示例更新了答案以有条件地修改矩阵
    • 谢谢!我还有最后一个问题,那我就不打扰你了。在我的最终矩阵中,矩阵末尾有一个附加列,其中包含每行的阈值,因此每一行都有不同的阈值。此外,如果这些阈值低于新生成的与原始矩阵大小相等的矩阵,包含“runif”数字,我将在该条目中设置原始矩阵的值为零。我应该如何解决这个问题?
    • @LuukS 这与最初的问题有很大的不同。需要将逐行阈值合并到原始lapply 中,或者使用apply 迭代输出matrix。比较matrix 应该类似于上面的答案,但比较每个matrix 以获得一个逻辑向量。 stackoverflow.com/questions/61622588/…
    • 谢谢!你帮了我很大的忙!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    相关资源
    最近更新 更多