在R中随机指定的列子集中的矩阵的行

时间:2018-03-06 22:36:34

标签: r

我有这个矩阵

mu<-1:100
sigma<-100:1
sample.size<-10
toy.mat<-mapply(function(x,y){rnorm(x,y,n=sample.size)},x=mu,y=sigma)
colnames(toy.mat) <- c(rep(1,10),rep(2,10), rep(3,10), rep(4,10), rep(5,10), 
                      rep(6,10), rep(7,10), rep(8,10), rep(9,10), rep(10,10) )

对于名为(1)的10列,我喜欢随机选择5对和每行的rowums以生成5列(1a,1b,1c,1d,1e)。我将对名为2,3至10的列执行相同的操作。 是否有data.table方法来执行此操作?

1 个答案:

答案 0 :(得分:0)

我仍然不确定你要做什么。

这就是我的理解。

  1. 我首先将toy.mat拆分为10个矩阵(块)的list。这是为了方便。

    # Split toy.mat into list of matrices
    lst <- lapply(seq(1, 100, by = 10), function(i) toy.mat[, i:(i+9)]);
    
  2. 接下来,通过从序列1:10中抽取10个数字并将它们强制转换为5x2矩阵,生成5个随机对。重复所有10个矩阵块。

    # Generate 5 random pairs
    set.seed(2017);   # For reproducibility of results
    rand <- replicate(10, matrix(sample(1:10, 10), ncol = 5), simplify = FALSE);
    head(rand, n = 2);
    #[[1]]
    #     [,1] [,2] [,3] [,4] [,5]
    #[1,]   10    4    9    1    6
    #[2,]    5    3    8    2    7
    #
    #[[2]]
    #     [,1] [,2] [,3] [,4] [,5]
    #[1,]    7    9    3    5   10
    #[2,]    1    4    2    6    8
    
  3. 根据rand中的对选择相应的列,并计算rowSums。为每个矩阵块执行此操作。

    # Select column pairs and calculate rowSums
    lst.rand <- lapply(1:10, function(i)
        sapply(as.data.frame(rand[[i]]), function(w) rowSums(lst[[i]][, w])));
    
  4. list个元素绑定到matrix,并设置列名称。

    # Bind into
    mat <- do.call(cbind, lst.rand);
    colnames(mat) <- as.vector(sapply(1:10, function(i) paste0(i, letters[1:5])));
    mat[1:5, 1:6];
    #             1a         1b          1c         1d         1e        2a
    #[1,]  21.410826   34.90337  -11.297396  -50.56332 -115.82456  51.32369
    #[2,]   5.323713 -144.26640  169.697538  -58.35540   96.25637 -78.95717
    #[3,] -78.925937  -45.32790 -177.546469  251.69348  -52.85132 123.38741
    #[4,] -33.673704  -95.64937    3.561921 -253.95046 -136.88182 -10.20650
    #[5,]  51.080564 -180.87033 -161.861342  108.41120  188.07454  52.34226