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

How to count the number of negative values for each observation of a certain variable

我想使用前 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()

我们可以使用匿名函数调用(或创建新函数)而不是整列 '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()

编辑:将 rollapply 更改为 rollapplyr(基于@IceCreamToucan 的评论)

数据

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

您可以创建一个向量 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