从列表创建一个数组,每个值具有不同数量的输出

时间:2018-08-07 17:31:33

标签: arrays r dataframe

我正在尝试从列表中创建一个数组,该数组对于从函数获得的每个值都有不同数量的输出。

这是我正在使用的代码:

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

2 个答案:

答案 0 :(得分:2)

我使用herehere的技巧提出了与@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