我有一个数据框,我想计算整个时期内变量value
的均值,不包括+-危机为1
前后的两个观察值(我不在乎关于缺少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
为了不考虑第一次危机之后的时期,而是实际上在第二次危机中经历的时期。有想法吗?
答案 0 :(得分:3)
另一种基本的R解决方案,使用outer
+ c
+ unique
过滤掉行,即
r <- mean(na.omit(df[-unique(c(outer(which(df$crisis==1),-2:2,"+"))),"value"]))
这样
> r
[1] 5
答案 1 :(得分:2)
我们可以编写一个函数,该函数排除 src="https://www.facebook.com/plugins/share_button.php?href=https%3A%2F%{{ your url }}%2F{{ detail-page }}%2F{{ unique-identifier }}&layout=button_count&size=large&appId=243300912962319&width=150&height=22"width="150" height="22" style="border:none;overflow:hidden" scrolling="no"frameborder="0" allowTransparency="true" allow="encrypted-media">
之后的+-2个观测值。
crisis = 1
custom_mean <- function(c, v) {
inds <- which(c == 1)
mean(v[-unique(c(sapply(inds, `+`, -2:2)))], na.rm = TRUE)
}
用于假设一个国家可能存在多个sapply
情况。
然后我们可以为每个crisis = 1
应用此功能。
country
答案 2 :(得分:1)
使用基数R的此解决方案有效,只要'crisis == 1'的值只有一个,并且在'crisis == 1'的行之前和之后始终有两行
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), ]