0

我正在尝试使用多行公式来创建一个新的计算列,但无法弄清楚。

假设我的数据是这样的:

x     y

1     2

1     2

1     6

1     7

2     4

2     5

2     9

我想创建一个计算列 z ,其中将具有以下逻辑:

如果 x 的值等于 x 的前一个值,则 y-previous(x) 否则为 0。

4

3 回答 3

2

尝试这个:

# 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))

希望能帮助到你

于 2019-04-04T19:32:19.390 回答
1

或者在基础 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))
于 2019-04-04T19:35:12.560 回答
0

布尔算术与用于构造滞后变量的头和尾一起使用。(第一个实现使用了错误的逻辑):

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
于 2019-04-04T19:40:52.740 回答