我想使用先前的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()
答案 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))