我正在尝试从列表中创建一个数组,该数组对于从函数获得的每个值都有不同数量的输出。
这是我正在使用的代码:
list_i1 = sapply(implicit$image_1_id, num, simplify = 'array')
这些是输出。
> list_i1[[1]]
[1] 86 101
> list_i1[[2]]
[1] 35 61 112
> list_i1[[3]]
[1] 10 15
由于某些值具有更多的2个输出数字,而另一些具有3个,因此无法从以下列表创建数组。理想情况下,我希望插槽中的零不被数组中的第三个输出填充,以便看起来像这样:
1 86 35 10
2 101 61 15
3 0 112 0
答案 0 :(得分:2)
我使用here和here的技巧提出了与@Fernandes非常相似的解决方案
重新创建示例:
lst <- list(c(86, 101), c(35, 61, 112), c(10, 15))
# [[1]]
# [1] 86 101
#
# [[2]]
# [1] 35 61 112
#
# [[3]]
# [1] 10 15
找出所需的行数,然后将每个向量扩展到该长度:
num_row <- max(sapply(lst, length))
for (i in seq_along(lst)) {
length(lst[[i]]) <- num_row
}
# [[1]]
# [1] 86 101 NA
#
# [[2]]
# [1] 35 61 112
#
# [[3]]
# [1] 10 15 NA
列将所有现在相等长度的向量绑定在一起形成矩阵:
m <- sapply(lst, cbind)
# [,1] [,2] [,3]
# [1,] 86 35 10
# [2,] 101 61 15
# [3,] NA 112 NA
将所有NA替换为所需的0:
m[is.na(m)] <- 0
# [,1] [,2] [,3]
# [1,] 86 35 10
# [2,] 101 61 15
# [3,] 0 112 0
我真的很想用某种“应用”代替for循环,但无法弄清楚。如果有人知道如何不使用for循环,我想看看它!
答案 1 :(得分:0)
a = c(86, 101)
b = c(35, 61, 112)
c = c(10, 15)
list_i1 = list(a, b, c)
n = max(length(list_i1[[1]]),
length(list_i1[[2]]),
length(list_i1[[3]]))
length(list_i1[[1]]) = n
length(list_i1[[2]]) = n
length(list_i1[[3]]) = n
x = cbind(list_i1[[1]], list_i1[[2]], list_i1[[3]])
x[is.na(x)] = 0
x
# [,1] [,2] [,3]
#[1,] 86 35 10
#[2,] 101 61 15
#[3,] 0 112 0