在某些行之前删除观察

时间:2020-02-07 10:34:53

标签: r

我有一个数据框,我想计算整个时期内变量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

为了不考虑第一次危机之后的时期,而是实际上在第二次危机中经历的时期。有想法吗?

3 个答案:

答案 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), ]
相关问题