【问题标题】:With R, how can I separate continuous values from a dataframe with item NA and calculate the average of only variable Y?使用 R,如何将连续值与项目 NA 的数据帧分开并计算仅变量 Y 的平均值?
【发布时间】:2020-12-25 04:06:32
【问题描述】:
  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,依此类推...

【问题讨论】:

    标签: r dataframe subset na


    【解决方案1】:

    您的数据:

    df = data.frame(X=c(1,2,NA,NA,NA,NA,1,2,1,1),Y=c(2,4,NA,NA,NA,NA,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,blocks,mean)))
    [1] 3 7
    

    【讨论】:

      【解决方案2】:

      我们可以使用 data.table 中的 rleid 创建连续值组,在每个组内计算 meanY 值/

      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, NA, NA, NA, 1L, 2L, 1L, 1L), 
          Y = c(2L, 4L, NA, NA, NA, NA, 4L, 6L, 8L, 10L)), 
      class = "data.frame", row.names = c(NA, -10L))
      

      【讨论】:

      • 我有这个错误:没有适用于“filter_”的方法应用于“逻辑”类的对象
      • @Kerbe 你能在我的帖子中分享的数据上测试一下吗?它适用于该数据吗?
      • @Kerbe 你可以select你想要的列。要选择gr 列,您可以执行df1 &lt;- df %&gt;% group_by(gr = data.table::rleid(is.na(Y))) %&gt;% summarise(Y = mean(Y, na.rm = TRUE)) %&gt;% filter(!is.na(Y)) %&gt;% select(gr)。输出在df1
      • 谢谢!我有很多数据作为输入,处理速度很慢。
      • 对不起,我不明白你的问题。在您的帖子中,您只展示并提到了一个数据框,而我的回答试图回答这个问题。
      猜你喜欢
      • 2013-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 2018-01-04
      相关资源
      最近更新 更多