R расширяет и обрабатывает данные с вложенным циклом - PullRequest
0 голосов
/ 30 марта 2019

Мне нужно расширить некоторые данные и затем ограничить, какие данные остаются через хвост.

Пример данных:

list_1 <- list(1:15)
list_2 <- list(16:30)
list_3 <- list(31:45)
short_lists[[1]] <- list_1
short_lists[[2]] <- list_2
short_lists[[3]] <- list_3
str(short_lists)
List of 3
 $ :List of 1
  ..$ : int [1:15] 1 2 3 4 5 6 7 8 9 10 ...
 $ :List of 1
  ..$ : int [1:15] 16 17 18 19 20 21 22 23 24 25 ...
 $ :List of 1
  ..$ : int [1:15] 31 32 33 34 35 36 37 38 39 40 ...

И как долго я хочу, чтобы мой хвост заданного списка был из list_1, list_2, list_3

how_long <- 
c(4,2,5,3,6,4,7,5,8,6,9,7,10,8,2,4,6,8,10,12,14,10,9,7,11)

И я расширяю вложенные циклы for и пытаюсь получить хвост расширенных списков, но просто получаю расширенные списки.

for (i in 1:length(how_long)) {
for (j in 1:length(short_lists)) { 
tail_temp[[j]][i] <- tail(short_lists2[[j]], n = how_long[i])
}
}

И это дает:

str(tail_temp)
List of 3
 $ :List of 25
  ..$ : int [1:15] 1 2 3 4 5 6 7 8 9 10 ...
  ..$ : int [1:15] 1 2 3 4 5 6 7 8 9 10 ...
  ..$ : int [1:15] 1 2 3 4 5 6 7 8 9 10 ...
  [snip]
  ..$ : int [1:15] 1 2 3 4 5 6 7 8 9 10 ...
 $ :List of 25
  ..$ : int [1:15] 16 17 18 19 20 21 22 23 24 25 ...
  ..$ : int [1:15] 16 17 18 19 20 21 22 23 24 25 ...
  ..$ : int [1:15] 16 17 18 19 20 21 22 23 24 25 ...
  [snip]
  ..$ : int [1:15] 16 17 18 19 20 21 22 23 24 25 ...
 $ :List of 25
  ..$ : int [1:15] 31 32 33 34 35 36 37 38 39 40 ...
  ..$ : int [1:15] 31 32 33 34 35 36 37 38 39 40 ...
  ..$ : int [1:15] 31 32 33 34 35 36 37 38 39 40 ...
  [snip]
  ..$ : int [1:15] 31 32 33 34 35 36 37 38 39 40 ...

И я рад, что j были расширены, но я никогда не добираюсь до конца и то, что я ищу:

str(tail_temp)
List of 3
 $ :List of 25
  ..$ : int [1:4] 12 13 14 15
  ..$ : int [1:2] 14 15
  ..$ : int [1:5] 11 12 13 14 15
[snip]

так что за простую вещь мне не хватает. Любая помощь приветствуется. Благодаря.

1 Ответ

0 голосов
/ 30 марта 2019

Действительно очень близко.

Я предпочитаю векторы в списках больше R.
Если вы знакомы с python, векторы ведут себя как 'списки' в python.
Где, как ведут себя списки в Rкак словари.

Таким образом, вам просто нужно сначала удалить список (в вектор),
, чтобы затем присвоить элементу списка, следовательно, вместо него следует назначить:
tail_temp[[i]][[j]]из tail_temp[i][[j]]

list_1 <- list(1:15)
list_2 <- list(16:30)
list_3 <- list(31:45)
short_lists = list()
short_lists[[1]] <- list_1
short_lists[[2]] <- list_2
short_lists[[3]] <- list_3

how_long <- c(4,2,5,3,6,4,7,5,8,6,9,7,10,
              8,2,4,6,8,10,12,14,10,9,7,11)

tail_temp = list()

for (i in 1:length(short_lists)){
    tail_temp[[i]] = list()
    for (j in 1:length(how_long)){
       tail_temp[[i]][[j]] <- tail(unlist(short_lists[[i]]), n = how_long[j])
    }
}

Выход

[[1]]
[[1]][[1]]
[1] 12 13 14 15

[[1]][[2]]
[1] 14 15

[[1]][[3]]
[1] 11 12 13 14 15
…
[[3]][[23]]
[1] 37 38 39 40 41 42 43 44 45

[[3]][[24]]
[1] 39 40 41 42 43 44 45

[[3]][[25]]
 [1] 35 36 37 38 39 40 41 42 43 44 45
...