Как найти разницу значений max & min в одной группе в переменной в кадре данных - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть три переменные A, B & C в следующем формате

A         B     C
Cat1      1    NA       
Cat1      2    NA
Cat1      1    NA
Cat1      2    NA
Cat1      NA   4
Cat1      NA   1
Cat1      NA   6
Cat1      NA   4
Cat1      7    NA       
Cat1      9    NA
Cat1      3    NA
Cat1      2    NA
Cat1      NA   2
Cat1      NA   4 
Cat1      NA   5
Cat1      NA   9
.         .    .
.         .    .        
.         .    .
.         .    .

Допустим, в переменной C, где числовые значения являются частью NA, она должна называться как одна группа, и я долженнайти разницу максимальных и минимальных значений в этой группе. Может кто-то помочь

желаемый результат:

Конечно.Желаемый результат будет выглядеть следующим образом: A Trips Value

                              Cat 1   Trip1      xx (dif of max & min of that trip)                                                       

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Решение с использованием dplyr и tidyr.

library(dplyr)
library(tidyr)

dat2 <- dat %>%
  mutate(trip = cumsum(is.na(C))) %>%
  drop_na(C) %>%
  mutate(trip = group_indices(., trip)) %>%
  group_by(trip) %>%
  summarize(Diff = max(C) - min(C)) %>%
  ungroup()
dat2

# # A tibble: 2 x 2
#    trip  Diff
#   <int> <dbl>
# 1     1     5
# 2     2     7

Данные

dat <- read.table(text = "A         B     C
Cat1      1    NA       
                  Cat1      2    NA
                  Cat1      1    NA
                  Cat1      2    NA
                  Cat1      NA   4
                  Cat1      NA   1
                  Cat1      NA   6
                  Cat1      NA   4
                  Cat1      7    NA       
                  Cat1      9    NA
                  Cat1      3    NA
                  Cat1      2    NA
                  Cat1      NA   2
                  Cat1      NA   4 
                  Cat1      NA   5
                  Cat1      NA   9",
                  header = TRUE, stringsAsFactors = FALSE)
0 голосов
/ 11 декабря 2018

Из того, что я понимаю, вы можете сделать следующее

library(data.table)
dt <- fread(text)
dt[, .(C = diff(range(C))), by = .(grp = rleid(is.na(C)))]
#   grp  C
#1:   1 NA
#2:   2  5
#3:   3 NA
#4:   4  7

Для B и C одновременно сделать

dt[, lapply(.SD, function(x) diff(range(x))), by = .(grp = rleid(is.na(C))), .SDcols = c('B', 'C')]
#   grp  B  C
#1:   1  1 NA
#2:   2 NA  5
#3:   3  7 NA
#4:   4 NA  7

Другой вариант удалить NA s

cols <- c('B', 'C')
out <- dt[, lapply(.SD, function(x) diff(range(x))), by = rleid(is.na(C)), .SDcols = cols
          ][, lapply(.SD, na.omit), .SDcols = cols
            ][, grp := rleid(B)]
out
#   B C grp
#1: 1 5   1
#2: 7 7   2

Обратите внимание, что второе и третье решения предполагают, что B равно NA, когда C не наоборот,

данные

text <- "A         B     C
Cat1      1    NA       
Cat1      2    NA
Cat1      1    NA
Cat1      2    NA
Cat1      NA   4
Cat1      NA   1
Cat1      NA   6
Cat1      NA   4
Cat1      7    NA       
Cat1      9    NA
Cat1      3    NA
Cat1      2    NA
Cat1      NA   2
Cat1      NA   4 
Cat1      NA   5
Cat1      NA   9"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...