У меня есть оператор ifelse, и я хочу увеличивать переменную на 1 каждый раз, когда выполняется условие, и сбрасывать счет, вычитая весь счет -count, если условие не выполняется.

df = data.frame(indicator= c(60,61,58,40,70,80))

position = 0
df$sig = ifelse((df$indicator > 60), 
       (position = position + 1), 
       -position)

Ответ будет выглядеть так

df = data.frame(indicator= c(60,61,58,40,70,80),
                sig = c(0,1,0,0,1,2))

Это необходимо для отслеживания торговой позиции (покупайте, если за 60, и продавайте, если под, но отслеживайте, насколько велика позиция.

Как я могу сделать это в R?

1
Davis 23 Фев 2018 в 16:51

4 ответа

Лучший ответ

Может быть так, с dplyr и rleid из пакета data.table:

df = data.frame(indicator= c(60,61,58,40,70,80))

library(dplyr)
library(data.table)
df %>%
  group_by(group = rleid(indicator > 60)) %>%
  mutate(sig = cumsum(indicator > 60)) %>% 
  ungroup() %>%
  select(-group) %>%
  as.data.frame

Выход:

  indicator sig
1        60   0
2        61   1
3        58   0
4        40   0
5        70   1
6        80   2

Или, альтернативно, только с data.table:

df = data.frame(indicator= c(60,61,58,40,70,80))

library(data.table)
setDT(df)[,sig := cumsum(indicator > 60), rleid(indicator > 60)]

Надеюсь это поможет!

4
h3rm4n 23 Фев 2018 в 14:43

С vanilla R вы можете использовать rle и ave + cumsum:

rl <- rle(df$indicator > 60)
rl$values <- seq_along(rl$values)

df$sig <- ave(df$indicator, inverse.rle(rl), FUN = function(x) cumsum(x > 60))

Результат:

> df
  indicator sig
1        60   0
2        61   1
3        58   0
4        40   0
5        70   1
6        80   2
3
h3rm4n 23 Фев 2018 в 14:36
count = 0
count = count + sum(ifelse(df$colour == "green", 1, 0))

Однако вы могли бы прямо сделать это:

count = sum(df$colour == "green")

Это работает, потому что TRUE равно 1, а FALSE равно 0, когда вы их суммируете.

0
AidanGawronski 23 Фев 2018 в 13:53

Это было бы:

position <- 0

df <- data.frame(indicator= c("60","61","58","40","70","80"))
df$indicator <- as.numeric(df$indicator)

df_sum <- sum(df$indicator)

position <- ifelse(df_sum > 60, position + 1, position -1)
0
Prometheus 23 Фев 2018 в 14:07