Вычитание функции с использованием разных строк и столбцов - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть такой фрейм данных:

   ROW     ID   ORDER       START      FINISH
    1      A      1           0            1
    2      A      1           2            4
    3      B      1           0            2
    4      A      2           4            5
    5      B      2           2            5
    6      B      2           6            8

Я хочу создать новый столбец, который для каждой строки вычитает что-то вроде:

START[x] - FINISH[x-1] 

, где x - строка и возвращает NAесли ORDER или ID изменен так, что это будет результат: (рассмотрим кадр данных, упорядоченный по ORDER, а не по ID)

  ROW     ID   ORDER         START       FINISH      NEW
    1      A      1           0            1        NA (first value) 
    2      A      1           2            4          1
    3      B      1           0            2        NA(changed ID) 
    4      A      2           4            5        NA(changed Order) 
    5      B      2           2            3        NA(changed ID) 
    6      B      2           6            8          3

Я новичок в R, поэтому не могу понять, как это сделать ...

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

с data.table:

library(data.table)
setDT(df)
df[,NEW := START-shift(FINISH),by=.(ID,ORDER)]

#    ROW ID ORDER START FINISH NEW
# 1:   1  A     1     0      1  NA
# 2:   2  A     1     2      4   1
# 3:   3  B     1     0      2  NA
# 4:   4  A     2     4      5  NA
# 5:   5  B     2     2      5  NA
# 6:   6  B     2     6      8   1
0 голосов
/ 24 апреля 2018

В dplyr это сгруппировано mutate, отстает FINISH:

library(dplyr)

df <- data_frame(ROW = 1:6, 
                 ID = c("A", "A", "B", "A", "B", "B"), 
                 ORDER = c(1L, 1L, 1L, 2L, 2L, 2L), 
                 START = c(0L, 2L, 0L, 4L, 2L, 6L), 
                 FINISH = c(1L, 4L, 2L, 5L, 5L, 8L))

df2 <- df %>% 
    group_by(ID, ORDER) %>% 
    mutate(NEW = START - lag(FINISH))

df2
#> # A tibble: 6 x 6
#> # Groups:   ID, ORDER [4]
#>     ROW ID    ORDER START FINISH   NEW
#>   <int> <chr> <int> <int>  <int> <int>
#> 1     1 A         1     0      1    NA
#> 2     2 A         1     2      4     1
#> 3     3 B         1     0      2    NA
#> 4     4 A         2     4      5    NA
#> 5     5 B         2     2      5    NA
#> 6     6 B         2     6      8     1

Вы можете сделать то же самое в базе R с подходом разделения-применения-объединения, хотя это выглядит не так хорошо:

df2 <- do.call(rbind, 
               lapply(split(df, interaction(df$ID, df$ORDER)), 
                      function(x){
                          x$NEW <- x$START - c(NA, x$FINISH[-nrow(x)]); 
                          x
                      }))

df2
#>       ROW ID ORDER START FINISH NEW
#> A.1.1   1  A     1     0      1  NA
#> A.1.2   2  A     1     2      4   1
#> B.1     3  B     1     0      2  NA
#> A.2     4  A     2     4      5  NA
#> B.2.5   5  B     2     2      5  NA
#> B.2.6   6  B     2     6      8   1

Обратите внимание, что пятый элемент FINISH изменяется во входных и выходных данных в вопросе, поэтому результат NEW изменяется в строке 6. Однако логика сохраняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...