【问题标题】:Count consecutive not null values from a row in R从R中的一行计算连续的非空值
【发布时间】:2015-12-04 19:48:56
【问题描述】:

我有一个带有数字数据行的数据框,我想计算每一行中连续非空值的数量,并将平均值作为以下示例。

## Example data
dd <- data.frame(v1 = NA, v2 = 1,  v3  = 2,  v4 = 3,  v5  = NA, v6 = NA, v7 = 5,
           v8 = 4,  v9 = NA, v10 = NA, v11= NA, v12 = 6, v13 = 9, v14 = 7,
           v15 = 10)

x2 <- c(0, 1, 2, 3, NA, 1, 5, 4, NA, NA, 6, 6, 9, 7,NA)
dd <- rbind(dd, x2)
rownames(dd) <- c("id1","id2")

我要创建的规则(例如“id1”)是:

#positions for v2, v3 and v4         = 3 non-null values
#positions for v7 and v8             = 2 non-null values
#positions for v12, v13, v14 and v15 = 4 non-null values

最终结果

id1_non_nulls_mean = (3 + 2 + 4)/3 = 3

如果有帮助,非常感谢!

【问题讨论】:

    标签: r null


    【解决方案1】:

    应该这样做:

    > dd
        v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15
    id1 NA  1  2  3 NA NA  5  4 NA  NA  NA   6   9   7  10
    id2  0  1  2  3 NA  1  5  4 NA  NA   6   6   9   7  NA
    > apply(dd, 1, function(x) {r = rle(!is.na(x)); mean(r$lengths[r$values])})
         id1      id2 
    3.000000 3.666667 
    

    编辑

    使用 Richard 的建议使其更简单、更易读:

    apply(dd, 1, function(x) with(rle(!is.na(x), mean(lengths[values])))
    

    【讨论】:

    • 非常感谢 Señor O。这真的解决了我的问题!
    【解决方案2】:

    这是一种通过重塑来做到这一点的方法。

    library(tidyr)
    library(dplyr)
    
    dd %>%
      add_rownames %>%
      gather(variable, value, -rowname) %>%
      group_by(rowname) %>%
      mutate(group = 
               value %>% is.na %>% `!` %>%
               `&`(value %>% lag %>% is.na) %>%
               cumsum) %>%
      filter(value %>% is.na %>% `!`) %>%
      count(rowname, group) %>%
      summarize(average_n = mean(n))
    

    【讨论】:

    • bramtayl,感谢您的贡献。您的示例有点复杂,但非常有用。
    猜你喜欢
    • 2018-11-17
    • 1970-01-01
    • 2021-05-08
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    相关资源
    最近更新 更多