问题描述
X Y
1 1 2
2 2 4
3 NA NA
4 NA NA
5 NA NA
6 NA NA
7 1 4
8 2 6
9 1 8
10 1 10
应该是这样:在第一种情况下,值2和4的平均值是3在第二种情况下,值4,6,8,10的平均值是7,依此类推...
解决方法
我们可以使用rleid
中的data.table
创建连续值组,在每个组中计算mean
个值中的Y
/
library(dplyr)
df %>%
group_by(gr = data.table::rleid(is.na(Y))) %>%
summarise(Y = mean(Y,na.rm = TRUE)) %>%
filter(!is.na(Y)) -> df1
df1
# gr Y
# <int> <dbl>
#1 1 3
#2 3 7
data.table
的实现方式是:
library(data.table)
df1 <- setDT(df)[,.(Y = mean(Y,na.rm = TRUE)),rleid(is.na(Y))][!is.na(Y)]
数据
df <- structure(list(X = c(1L,2L,NA,1L,1L),Y = c(2L,4L,6L,8L,10L)),class = "data.frame",row.names = c(NA,-10L))
,
您的数据:
df = data.frame(X=c(1,2,1,1),Y=c(2,4,6,8,10))
您可以使用diff(complete.cases(..))
定义连续的行,且不包含NA:
blocks = cumsum(c(0,diff(complete.cases(df)) != 0 ))
block_means = tapply(df$Y,blocks,mean)
0 1 2
3 NA 7
block_means[!is.na(block_means)]
0 2
3 7
或者如果您不需要知道订单:
na.omit(as.numeric(tapply(df$Y,mean)))
[1] 3 7