Как мне сделать многорядную формулу? - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь использовать многострочную формулу, чтобы получить новый вычисляемый столбец, но не могу понять его.

Предположим, мои данные таковы:

x     y

1     2

1     2

1     6

1     7

2     4

2     5

2     9

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

Если значение x равно предыдущему значению x, то y-previous (x) иначе 0.

Ответы [ 3 ]

2 голосов
/ 04 апреля 2019

Попробуйте:

# load package
library(dplyr)
# reproduce your data
df <- data.frame(x = rep(1:2, c(4, 3)),
                 y = c(2, 2, 6, 7, 4, 5, 9))
df %>%
  mutate(z = case_when(x == lag(x) ~ y - lag(x),
                       TRUE ~ 0))

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

1 голос
/ 04 апреля 2019

Или в базе R это можно сделать с помощью ifelse

df$z <- c(0, ifelse(diff(df$x) == 0, 1, 0)*(df$y[-1]-df$x[-nrow(df)]))
#   x y z
# 1 1 2 0
# 2 1 2 1
# 3 1 6 5
# 4 1 7 6
# 5 2 4 0
# 6 2 5 3
# 7 2 9 7

Данные

df <- structure(list(x = c(1L, 1L, 1L, 1L, 2L, 2L, 2L), y = c(2, 2, 
                                                          6, 7, 4, 5, 9)), class = "data.frame", row.names = c(NA, -7L))
0 голосов
/ 04 апреля 2019

Булева арифметика работает с головой и хвостом, используемым для построения лаговых переменных. (первая реализация использовала неправильную логику):

dat$new <- with(dat, c(0,  # starting value for no prior x
                   tail(y,-1)-head(x, -1)) * #The values if x[-1]==x
              # then construct the x[-1] == x logical vector
                     ( c(0,                        # starting
                   tail(x,-1)== head(x,-1)))) # prior x == current x 

> dat
  x y new
1 1 2   0
2 1 2   1
3 1 6   5
4 1 7   6
5 2 4   0
6 2 5   3
7 2 9   7
...