列表中的随机元素具有相同的名称

时间:2017-10-12 11:55:55

标签: r

我有一个很大的矩阵列表。格式可以在这里看到:Input Data

这些是50个矩阵,但分为子列表和有序。我需要的是一个包含50个矩阵的随机顺序列表,同时保留0-10字符的名称。例如:

0: [1:28, 1:28] 0 0 0 ...
5: [1:28, 1:28] 0 0 0 ...
3: [1:28, 1:28] 0 0 0 ...
0: [1:28, 1:28] 0 0 0 ...
8: [1:28, 1:28] 0 0 0 ...
8: [1:28, 1:28] 0 0 0 ...

3 个答案:

答案 0 :(得分:2)

如果没有数据集示例,我不知道这是否会运行,但现在就可以了。

set.seed(3694)
inx <- sample(names(trainData), 50, TRUE)

tmp <- lapply(inx, function(i){
    lst <- trainData[[i]]
    mat <- lst[[sample(seq_along(lst), 1)]]
    list(i, mat)
})

result <- lapply(tmp, `[[`, 2)
names(result) <- sapply(tmp, `[[`, 1)
rm(tmp)

修改
通过CPak测试数据,更正了结果名称中的错误。它现在似乎做了OP所要求的。

答案 1 :(得分:1)

使用样本(...)怎么样?第二次运行它会给你新的排列:

> a = list('0'=list(2,3),'1'=2,'2'=3)
> a
$`0`
$`0`[[1]]
[1] 2

$`0`[[2]]
[1] 3


$`1`
[1] 2

$`2`
[1] 3

> sample(a,length(a))
$`1`
[1] 2

$`2`
[1] 3

$`0`
$`0`[[1]]
[1] 2

$`0`[[2]]
[1] 3


> sample(a,length(a))
$`2`
[1] 3

$`1`
[1] 2

$`0`
$`0`[[1]]
[1] 2

$`0`[[2]]
[1] 3

答案 2 :(得分:1)

你可以试试这个

数据

data <- lapply(1:10, function(i) lapply(1:5, function(j) matrix(1:(28*28), nrow=28)))
names(data) <- 1:10
str(data)
# List of 10
 # $ 1 :List of 5
  # ..$ : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
  # ..$ : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
  # ..$ : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
  # ..$ : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
  # ..$ : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
 # $ 2 :List of 5
  # ..$ : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
  # ..$ : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
  # ..$ : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
  # ..$ : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
  # ..$ : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
 # etc

purrr::flatten您的列表

编辑如果每个列表的长度不同,您可以使用names(result) <- rep(1:length(data), times=(lengths(data)))代替

library(purrr)
result <- flatten(data)
names(result) <- rep(1:length(data), times=(lengths(data)))
str(result)
# List of 50
 # $ 1 : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
 # $ 1 : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
 # $ 1 : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
 # $ 1 : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
 # $ 1 : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
 # $ 2 : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
 # $ 2 : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
 # $ 2 : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
 # etc

随机

set.seed(1)
ans <- result[sample(1:50)]
str(ans)
# List of 50
 # $ 3 : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
 # $ 4 : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
 # $ 6 : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
 # $ 9 : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
 # $ 2 : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
 # $ 9 : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
 # $ 9 : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
 # $ 6 : int [1:28, 1:28] 1 2 3 4 5 6 7 8 9 10 ...
 # etc