我有一个数据框,我想要计算除+-两个观察值之前/之后的所有时间段的变量value
的平均值(我不关心是否缺少val)。计算应按国家/地区进行(尽管在下面的示例中我只有一个国家/地区)。示例:
country <- rep("AT",10)
value <- seq(1,10,1)
crisis <- c(0,0,0,NA,0,1,0,NA,0,0)
df <- data.frame(country, value, crisis)
df
mean(df$value[df$crisis == 0], na.rm=TRUE)
# expected result
exp_mean <- (1+2+3+9+10)/5
exp_mean
edit:
我希望得到一个一般的情况,在这种情况下,我们考虑数据集中其他可能的1,例如,如果我们
crisis[10] = 1
结果应为(3+9)/2
为了不考虑第一次危机之后的时期,但实际上在第二次危机中经历了一次危机。有什么想法吗?
发布于 2020-02-07 19:07:10
另一个基础R解决方案,使用outer
+ c
+ unique
来过滤出行,即,
r <- mean(na.omit(df[-unique(c(outer(which(df$crisis==1),-2:2,"+"))),"value"]))
这样的话
> r
[1] 5
发布于 2020-02-07 18:41:02
我们可以编写一个函数,它排除crisis = 1
之后的+- 2观测值的变量。
custom_mean <- function(c, v) {
inds <- which(c == 1)
mean(v[-unique(c(sapply(inds, `+`, -2:2)))], na.rm = TRUE)
}
假设一个国家/地区可能存在多个crisis = 1
情况,则使用sapply
。
然后,我们可以将此函数应用于每个country
。
library(dplyr)
df %>% group_by(country) %>% summarise(exp_mean = custom_mean(crisis, value))
# A tibble: 1 x 2
# country exp_mean
# <fct> <dbl>
#1 AT 5
发布于 2020-02-07 18:48:05
只要'crisis == 1‘只有一个值,并且在'crisis == 1’行的前后始终有两行,这种使用base R的解决方案就有效。
country <- rep("AT",10)
value <- seq(1,10,1)
crisis <- c(0,0,0,NA,0,1,0,NA,0,0)
df <- data.frame(country, value, crisis)
df
df[(which(df$crisis == 1) - 2):(which(df$crisis == 1) + 2), ]
此解决方案不适用于此数据的:
country <- rep("AT",11)
value <- seq(1,11,1)
crisis <- c(0,0,0,NA,0,1,0,NA,0,0,1)
df2 <- data.frame(country, value, crisis)
df2[(which(df2$crisis == 1) - 2):(which(df2$crisis == 1) + 2), ]
https://stackoverflow.com/questions/60111690
复制相似问题