如何计算某个变量的每次观察的负值数量
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
我想使用前 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