Использовать предыдущее значение внутри функции изменения - PullRequest
0 голосов
/ 15 мая 2018

У меня есть следующая таблица:

table<- data.frame(a = rep(100, 8),
                   b = seq(from = 0.2, by = 0.1, length.out = 8))

Я хотел бы получить следующий столбец c, который имеет значения:

  1. Для первого ряда возьмите * b
  2. Для второго ряда взять предыдущий ряд c , добавьте его во второй ряд a и затем умножьте на b . Следовательно, ((100 * 0,2) +100) * 0,3 = 36. Эта логика тогда одинакова для остальные ряды. Следовательно, для третьего ряда я бы имел: (100 + 36) * 0,4 = 54,4.

Я попробовал что-то вроде кода ниже, но я не могу сослаться на новый столбец внутри mutate.

table %>% mutate(c = (a + ifelse(is.na(lag(c), 0, lag(c)))) * b)

Несколько советов?

Спасибо!)

1 Ответ

0 голосов
/ 15 мая 2018

Сначала: table - плохое имя для пользовательской переменной, так как оно соответствует зарезервированной базовой R-функции.

Вот решение, использующее цикл for.

(Просто для предотвращения любых возражений for от цикла: мы не динамически растем объект здесь, а вместо этого меняем предварительноинициализированные записи, поэтому цикл for будет быстрым, это не значит, что более быстрых путей не будет ...):

# Initialise
df <- transform(df, c = a * b);

# Calculate c for rows 2..
for (i in 2:nrow(df)) df$c[i] <- (df$c[i - 1] + df$a[i]) * df$b[i];
df;
#    a   b        c
#1 100 0.2  20.0000
#2 100 0.3  36.0000
#3 100 0.4  54.4000
#4 100 0.5  77.2000
#5 100 0.6 106.3200
#6 100 0.7 144.4240
#7 100 0.8 195.5392
#8 100 0.9 265.9853

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

df <- data.frame(
    a = rep(100, 8),
    b = seq(from = 0.2, by = 0.1, length.out = 8))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...