R语言 在使用条件时,将mutate中的先前自计算作为选项返回

xpcnnkqh  于 2023-05-04  发布在  其他
关注(0)|答案(1)|浏览(88)

我有一个一列的数据框,想确定值是增加(1)还是减少(-1),当没有发现变化时,返回最后一次计算。我认为我的代码应该可以做到这一点,但dplyr返回一个错误,说“object”“not found”,我认为这是因为它本身。有没有想过如何做到这一点?

df <- data.frame(Val = c(1:5,5,5,5:1,1,1,1,6,1,1,5:1))

df %>%
  mutate(ValDirection = ifelse(Val > lag(Val, 1), 1,
                               ifelse(Val < lag(Val, 1), -1, lag(ValDirection, 1))))

预期结果应为:

df <- data.frame(Val = c(1:5,5,5,5:1, 1,1,1,6,1,1,5:1),
                 ValDirection = c(1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1))
8zzbczxx

8zzbczxx1#

发生错误的原因是您在定义ValDirection之前调用了它。您可以将lag(ValDirection, 1)替换为NA,并使用tidyr::fill()用以前的值填充缺失值。

library(dplyr)

df %>%
  mutate(ValDirection = ifelse(Val > lag(Val, 1), 1, ifelse(Val < lag(Val, 1), -1, NA))) %>%
  tidyr::fill(ValDirection)

您也可以使用dplyr中的case_when()来替换嵌套的ifelse()

df %>%
  mutate(ValDirection = case_when(Val > lag(Val, 1) ~ 1, Val < lag(Val, 1) ~ -1)) %>%
  tidyr::fill(ValDirection)

另一种想法是:

df %>%
  mutate(ValDirection = na_if(sign(c(1, diff(Val))), 0)) %>%
  tidyr::fill(ValDirection)
输出
#    Val ValDirection
# 1    1            1
# 2    2            1
# 3    3            1
# 4    4            1
# 5    5            1
# 6    5            1
# 7    5            1
# 8    5            1
# 9    4           -1
# 10   3           -1
# 11   2           -1
# 12   1           -1

相关问题