使用R,如何将连续的值与具有项NA的数据框分开,并仅计算变量Y的平均值?

问题描述

  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