首页 > 解决方案 > 如何计算某个变量的每个观察值的负值数量

问题描述

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

标签: rdplyrzoorollapply

解决方案


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

推荐阅读