如何为某个变量的每次观察计算负值的数量

时间:2019-06-30 17:55:16

标签: r dplyr zoo rollapply

我想使用先前的10个观察值来计算每个观察值的负值总数。我使用了以下代码,但是它不起作用-

funda_addit <- funda_addit %>% 
  group_by(TICKER) %>%
  arrange(year) %>% 
  mutate(NEG_EARN = rollapply(ni, 10, sum (ni<0), partial=TRUE)) %>% 
  ungroup()

实际上,我想创建一个新变量“ NEG_EARN”,它是变量“ ni”的前10个观测值(在我的数据中为10年)的负值数量。我也使用下面的代码,但是它不起作用-

funda_addit <- funda_addit %>% 
  group_by(TICKER) %>%
  arrange(year) %>% 
  mutate(NEG_EARN = rollapply(ni, 10, length(which(ni<0)), partial=TRUE)) %>% 
  ungroup()

2 个答案:

答案 0 :(得分:2)

您可以创建向量cumsum(ni < 0),然后从其中减去该向量的滞后版本

funda_addit %>% 
  group_by(TICKER) %>% 
  arrange(year) %>% 
  mutate(neg_earn = {cs <- cumsum(ni < 0)
                     cs - lag(cs, 10, default = 0)})

如果您将rollapply更改为rollapplyr(使用akrun的示例数据进行了测试),则这相当于akrun的答案

use_cumsum <- 
  funda_addit %>% 
    group_by(TICKER) %>% 
    arrange(year) %>% 
    mutate(neg_earn = {cs <- cumsum(ni < 0)
                       cs - lag(cs, 10, default = 0)})

use_rollapply <- 
  funda_addit %>% 
    group_by(TICKER) %>% 
    arrange(year) %>% 
    mutate(neg_earn = rollapplyr(ni, 10, FUN = f1, partial=TRUE))

all(use_cumsum == use_rollapply)
# [1] TRUE

答案 1 :(得分:1)

我们可以使用匿名函数调用(或创建一个新函数)代替整个列“ ni”

library(dplyr)
library(zoo)
f1 <- function(x) sum(x < 0)
funda_addit %>% 
  group_by(TICKER) %>%
  arrange(year) %>% 
  mutate(NEG_EARN = rollapplyr(ni, 10, FUN = f1, partial=TRUE)) %>% 
  ungroup()

编辑:根据{IceCreamToucan的评论,将rollapply更改为rollapplyr

数据

set.seed(24)
funda_addit <- data.frame(TICKER = rep(LETTERS[1:3], each = 20), 
      year = 1921:1940, ni = rnorm(60))