сохранение цикла во время матрицы или фрейма данных

#r #while-loop

#r #во время цикла

Вопрос:

Я хочу сэкономить время в матрице или фрейме данных таким образом, чтобы это упорядочивало меня

 i <- 15#year
pon<-list()
while (i < 63) {
pon[i] <-cumprod( vlookup(i:62,Tabla_de_mortalidad_css,4))
 i = i 1}
 

это моя команда, которую я выполняю
Я хочу, чтобы вы напечатали что-то вроде этого: например

 v1 v2 v3
1
2  1
3  2  1
4  3  2
.  .  .
.  .  .
.  .  .
 

v1, v2, v3 — мои переменные

Ответ №1:

Вам нужно что-то подобное?

 n <- 1:63
mat <- cbind(1:63, sapply(1:3, function(x) c(rep(NA, x), head(n, -x))))
mat

#      [,1] [,2] [,3] [,4]
# [1,]    1   NA   NA   NA
# [2,]    2    1   NA   NA
# [3,]    3    2    1   NA
# [4,]    4    3    2    1
# [5,]    5    4    3    2
# [6,]    6    5    4    3
# [7,]    7    6    5    4
#...
#...
 

Комментарии:

1. Спасибо за комментарий, у меня все еще есть вопрос, как мне заставить эту команду работать для моего кода, который у меня есть выше, то есть:`i <- 15 # year while (i <63) {` put [i] <-cumprod (vlookup (i: 62, Mortality_Table_css, 4)) ` i = i 1}` потому что я ищу i в своей таблице, в диапазоне i: 62, и этот результат накапливает его для меня, я хочу сохранить его в фрейме данных, где каждый i должен быть столбцом, но если вы посмотрите на следующую итерацию, это будет i = 16, то есть мне нужно и так далее длякаждый из столбцов.

2. Я не понимаю, что делает ваш код, что vlookup такое и т.д.

Ответ №2:

использовать tidyverse

 library(tidyverse)
n <- 1:10
Lag <- 1:3

df <- data.frame(n = n)
bind_cols(df, map_dfc(Lag, ~transmute(df, !!paste0("Lag", .x) := lag(n, n = .x))))
#>     n Lag1 Lag2 Lag3
#> 1   1   NA   NA   NA
#> 2   2    1   NA   NA
#> 3   3    2    1   NA
#> 4   4    3    2    1
#> 5   5    4    3    2
#> 6   6    5    4    3
#> 7   7    6    5    4
#> 8   8    7    6    5
#> 9   9    8    7    6
#> 10 10    9    8    7
 

Создано 2020-12-11 пакетом reprex (версия 0.3.0)

Комментарии:

1.Спасибо за комментарий, у меня все еще есть вопрос, как мне заставить эту команду работать для моего кода, который у меня есть выше, то есть `i <- 15` # year while (i <63) { put [i] <-cumprod (vlookup (i: 62, Mortality_Table_css, 4)) i = i 1} , потому что я ищу i в своей таблице в диапазоне i: 62, и этот результат накапливает его для лично я хочу сохранить его во фрейме данных, где каждый i должен быть столбцом, но если вы посмотрите на следующую итерацию, это будет i = 16, то есть мне нужно и так далее для каждого из столбцов.

Ответ №3:

Мы можем сделать это легко с shift помощью from data.table

 library(data.table)
do.call(cbind, shift(1:10, n = 1:3))
 

-вывод

 #        [,1] [,2] [,3]
# [1,]   NA   NA   NA
# [2,]    1   NA   NA
# [3,]    2    1   NA
# [4,]    3    2    1
# [5,]    4    3    2
# [6,]    5    4    3
# [7,]    6    5    4
# [8,]    7    6    5
# [9,]    8    7    6
#[10,]    9    8    7
 

Комментарии:

1.Спасибо за комментарий, у меня все еще есть вопрос, как мне заставить эту команду работать с моим кодом, который у меня есть выше, то есть `i <- 15` # year while (i <63) { pon [i] <-cumprod (vlookup (i: 62, Mortality_Table_css, 4)) i = i 1} , потому что я ищу i в своей таблице в диапазоне i: 62, и этот результат накапливает его дляя, чего я хочу, так это сохранить его во фрейме данных, где каждый i должен быть столбцом, но если вы посмотрите на следующую итерацию, это будет i = 16, то есть мне нужно и так далее для каждого из столбцов.