Получить резюме повторяющихся последовательных значений по строке в R - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь получить статистику (мин, макс, среднее) повторяющихся значений по строке в 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))

Для каждой строки я хочу добавить столбец с минимальным, максимальным и средним значением no. столбцов, содержащих последовательные 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 столбцами.

У кого-нибудь есть код для этого?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

A 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
0 голосов
/ 04 мая 2018

Вы можете 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
...