r - 输出对象的类别因输入数据不同而不同
问题描述
我试图为每次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
包括多个值和至少一个element
在n.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
语句来处理有问题的情况,但我认为可能有更简单和更有效的解决方案。
解决方案
我们可以写一个函数:
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
推荐阅读
- java - 如何在 Java 8 中使用 FilterFunction 过滤 XML
- node.js - node.js中的Python多处理-子进程打印不起作用
- javascript - 具有多个元素的 html2Canvas 查询
- java - 如何在构造函数中模拟实例?
- python - 如何将 a2c3d 转换为 accfd?
- java - 完成点击次数共享首选项的语法
- android - 从另一个 Fragment 中查找 Tab 位置
- c - C中的串行读取不返回数据
- php - 在 IIS 上运行的 PHP - 15 分钟后超时
- php - Chrome:当作为本地文件查看时,PHP 文件中的 HTML 内容不显示