Создание нового столбца с использованием предыдущего значения другого столбца и предыдущего значения самого себя - PullRequest
0 голосов
/ 27 апреля 2020

как я могу создать новый столбец, начальное значение которого равно 1, а следующие значения являются умножением предыдущего значения столбца (b) и предыдущего самого значения (d)?

эти данные только составлены, но имеют структуру моих данных:

> a <- rep(1:10, 3)
> b <- runif(30)
> c <- tibble(a,b)
> c
# A tibble: 30 x 2
       a     b
   <int> <dbl>
 1     1 0.945
 2     2 0.280
 3     3 0.464
 4     4 0.245
 5     5 0.917
 6     6 0.913
 7     7 0.144
 8     8 0.481
 9     9 0.873
10    10 0.754
# ... with 20 more rows

Затем я пытаюсь вычислить столбец d:

> c <- c %>%
+   group_by(a) %>%
+   mutate(d = accumulate(lag(b, k = 1), `*`, .init = 1))

, и он должен выглядеть следующим образом

# A tibble: 30 x 3
# Groups:   a [10]
       a     b      d
   <int> <dbl>  <dbl>
 1     1 0.945  1    <--- b[1] * d[1] = d[2]
 2     2 0.280  0.945
 3     3 0.464  0.265
 4     4 0.245  0.123
 5     5 0.917  0.03 
#...

Но вместо этого я получаю это сообщение об ошибке.

Fehler: Column `d` must be length 3 (the group size) or one, not 4

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Проблема в том, что когда вы инициализируете accumulate с .init =, это добавляет дополнительный первый элемент вектора.

Вы можете попробовать это:

library(dplyr)
library(purrr)

 c %>%
   group_by(a) %>%
   mutate(d = accumulate(b[(2:length(b))-1], `*`,.init=1)) %>% 
   arrange(a)
#       a     b      d
#   <int> <dbl>  <dbl>
# 1     1 0.266 1     
# 2     1 0.206 0.266 
# 3     1 0.935 0.0547
# 4     2 0.372 1     
# 5     2 0.177 0.372 
# … with 25 more rows

Данные

library(tibble)
set.seed(1)
 a <- rep(1:10, 3)
 b <- runif(30)
 c <- tibble(a,b)
0 голосов
/ 27 апреля 2020

Используя dplyr, я бы сделал это:

c %>% 
  mutate(d = 1*accumulate(.x = b[-length(b)], 
                         .init = 1,
                         .f = `*`))

# # A tibble: 30 x 3
# a      b        d
# <int>  <dbl>    <dbl>
#   1     1 0.562  1       
# 2     2 0.668  0.562   
# 3     3 0.100  0.375   
# 4     4 0.242  0.0376  
# 5     5 0.0646 0.00907 
# 6     6 0.373  0.000586
# 7     7 0.664  0.000219
# 8     8 0.915  0.000145
# 9     9 0.848  0.000133
# 10    10 0.952  0.000113
# # ... with 20 more rows
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...