【问题标题】:Get summaries of repeated consecutive values by row in R在R中按行获取重复连续值的摘要
【发布时间】:2018-10-15 01:10:18
【问题描述】:

我正在尝试在 R 中按行获取重复值的一些统计信息(最小值、最大值、平均值)。

我的数据框看起来像这样:

b <- as.data.frame(matrix(ncol=7, nrow=3, 
     c(3,NA,NA,4,5,NA,7,6,NA,7,NA,8,9,NA,NA,4,6,NA,NA,7,NA), byrow = TRUE))

对于每一行,我想添加一列,其中包含数字的最小值、最大值和平均值。包含连续 NA 的列,它应该是这样的

  V1 V2 V3 V4 V5 V6 V7 max min mean
1  3 NA NA  4  5 NA  7   2   1  1.5
2  6 NA  7 NA  8  9 NA   1   1  1.0
3 NA  4  6 NA NA  7 NA   2   1  1.33

这只是我的数据集的一个小例子,它有 2000 行和 48 列。

有人有这个的代码吗?

【问题讨论】:

  • 为什么第1行的平均值是1.5。不应该是(1 + 1 + 2)/ 3吗?
  • 你指的是关于每行包含NA的连续列数的统计信息吗?对于第 3 行,平均值为 (1+2+1) / 3 = 1.33,对吗?
  • 是的,你是对的,我只是在示例中除以错误的数字
  • 你能用正确的预期输出更新你的帖子吗?
  • 现在更正了 Mike

标签: r apply na summary


【解决方案1】:

您可以 apply 遍历行并获取非 NA 列的“运行”。一旦你有了这些,你就可以简单地获取这些的摘要统计信息:

b[,c("mean", "max", "min")] <- do.call(rbind, apply(b, 1, function(x){
                                                      res <- rle(!is.na(x))
                                                      res2 <- res[["lengths"]][res[["values"]]]
                                                      data.frame(mean = mean(res2), max = max(res2), min = min(res2))
                                                    }
                                                      ))

 b
#  V1 V2 V3 V4 V5 V6 V7     mean max min
#1  3 NA NA  4  5 NA  7 1.333333   2   1
#2  6 NA  7 NA  8  9 NA 1.333333   2   1
#3 NA  4  6 NA NA  7 NA 1.500000   2   1

【讨论】:

    【解决方案2】:

    dplyr 解决方案与 rle 计算向量中相等值的运行长度。

    library(dplyr)
    b %>% cbind( b %>% rowwise() %>% do(rl = rle(is.na(.))$lengths[rle(is.na(.))$values == T])) 
       %>% rowwise() 
       %>%  mutate(mean = mean(rl),
                   max = max(rl),
                   min = min(rl)) 
       %>% select(-rl)
    
    
    #      V1    V2    V3    V4    V5    V6    V7   max   min  mean
    #   <int> <int> <int> <int> <int> <int> <int> <int> <int> <dbl>
    # 1     3    NA    NA     4     5    NA     7     2     1  1.50
    # 2     6    NA     7    NA     8     9    NA     1     1  1.00
    # 3    NA     4     6    NA    NA     7    NA     2     1  1.33
    

    【讨论】:

      猜你喜欢
      • 2017-09-20
      • 2021-11-01
      • 2017-08-11
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 2016-02-05
      相关资源
      最近更新 更多