首页 > 解决方案 > 输出对象的类别因输入数据不同而不同

问题描述

我试图为每次n尝试绘制可变数量的样本。在这个例子中n = 8,因为length(n.obs) == 8. 绘制完所有样本后,我想将它们组合成一个matrix.

这是我的第一次尝试:

set.seed(1234)
n.obs <- c(2,1,2,2,2,2,2,2)
my.samples <- sapply(1:8, function(x) sample(1:4, size=n.obs[x], prob=c(0.1,0.2,0.3,0.4), replace=TRUE))
my.samples

这种方法产生一个list.

class(my.samples)
#[1] "list"

我使用以下方法确定输出中所需的列数matrix

max.len <- max(sapply(my.samples, length))
max.len
#[1] 2

matrix可以使用以下命令创建输出:

 corrected.list <- lapply(my.samples, function(x) {c(x, rep(NA, max.len - length(x)))})
 output.matrix <- do.call(rbind, corrected.list)
 output.matrix[is.na(output.matrix)] <- 0
 output.matrix
 #     [,1] [,2]
 #[1,]    4    3 
 #[2,]    3    0
 #[3,]    3    2
 #[4,]    3    4
 #[5,]    4    3
 #[6,]    3    3
 #[7,]    3    4
 #[8,]    1    4

上述方法似乎可以正常工作,因为它n.obs包括多个值和至少一个elementn.obs > 1. 但是,我希望代码足够灵活以处理以下各项n.obs

上面的sapply语句返回一个 2 x 8matrix和下面的n.obs.

set.seed(1234)
n.obs <- c(2,2,2,2,2,2,2,2)

上面的sapply语句返回integer带有以下内容的n.obs

set.seed(3333)
n.obs <- c(1,1,1,1,1,1,1,1)

上面的sapply语句返回list带有以下内容的 a n.obs

n.obs <- c(0,0,0,0,0,0,0,0)

以下是上述三个示例所需的结果n.obs

desired.output <- matrix(c(4, 3,
                           3, 3,
                           2, 3,
                           4, 4,
                           3, 3,
                           3, 3,
                           4, 1,
                           4, 2), ncol = 2, byrow = TRUE)

desired.output <- matrix(c(2,
                           3,
                           4,
                           2,
                           3,
                           4,
                           4,
                           1), ncol = 1, byrow = TRUE)

desired.output <- matrix(c(0,
                           0,
                           0,
                           0,
                           0,
                           0,
                           0,
                           0), ncol = 1, byrow = TRUE)

如何概括代码,使其始终返回matrix八行,而不管n.obs用作输入?一种方法是使用一系列if语句来处理有问题的情况,但我认为可能有更简单和更有效的解决方案。

标签: rsapply

解决方案


我们可以写一个函数:

get_matrix <- function(n.obs) {

   nr <- length(n.obs)
   my.samples <- sapply(n.obs, function(x) 
                  sample(1:4, size=x, prob=c(0.1,0.2,0.3,0.4), replace=TRUE))
   max.len <- max(lengths(my.samples))
   mat <- matrix(c(sapply(my.samples, `[`, 1:max.len)), nrow = nr, byrow = TRUE)
   mat[is.na(mat)] <- 0
   mat
}

检查输出:

get_matrix(c(2,1,2,2,2,2,2,2))

#     [,1] [,2]
#[1,]    1    4
#[2,]    4    0
#[3,]    4    3
#[4,]    4    4
#[5,]    4    2
#[6,]    4    3
#[7,]    4    4
#[8,]    4    4

get_matrix(c(1,1,1,1,1,1,1,1))

#     [,1]
#[1,]    4
#[2,]    4
#[3,]    3
#[4,]    4
#[5,]    2
#[6,]    4
#[7,]    1
#[8,]    4

get_matrix(c(0,0,0,0,0,0,0,0))
#     [,1]
#[1,]    0
#[2,]    0
#[3,]    0
#[4,]    0
#[5,]    0
#[6,]    0
#[7,]    0
#[8,]    0

推荐阅读