Добавьте значение предыдущей строки с текущей строкой и сохраните значение предыдущей строки при добавлении - PullRequest
0 голосов
/ 15 января 2019

В R у меня есть кадр данных D1. Содержит столбцы «ID» и «Case». ID имеет повторяющиеся значения, а регистр содержит «NA» и «Up».

D1

ID case 
aa NA   
aa NA    
aa Up    
aa NA    
cc NA    
cc NA    
dd NA    
dd NA    
dd Up    
dd NA    
dd NA    
dd NA    
ee NA    
ee NA    
ee NA    
ff up    
ff NA    
gg NA        

Итак, мое требование - создать новый столбец «Глубокий», в котором я хочу:

  1. Создать новый столбец «Глубокий», в котором значение равно 0.

  2. во-вторых, определите первое наблюдение идентификатора для каждой группы и присвойте ему значение 0 в столбце «Глубокий». например, первое «аа» всегда будет «0». Хотя это не повлияет на вид колонки «Глубокая», поскольку она все еще глубока столбец как значение 0.

  3. В-третьих, определите значение «Up» из столбца «case» и добавьте к нему 1. поэтому, когда case == up, то deep + 1, поэтому на выходе будет Deep = 1.

  4. В-четвертых, сохраните значение, созданное логикой 'case ==' Up ', т. Е. Равным' 1 ', и добавляйте к нему 1 до тех пор, пока не появится тот же' Id '. поэтому все значения с тем же Id после регистра == «Вверх» добавят предыдущее значение строки + 1 id deep = 2 и т. д.

Обратите внимание, что при каждом изменении идентификатора новое значение в поле "Deep" будет равно 0.

Ниже вывод, который я хочу

ID case deep
aa NA    0
aa NA    0
aa Up    1
aa NA    2
cc NN    0
cc NN    0
dd NA    0
dd NA    0
dd Up    1
dd NA    2
dd NA    3
dd NA    4
ee NA    0
ee NA    0
ee NA    0
ff up    1
ff NA    2
gg NA    0    

Здесь вы видите, что новый столбец создается с помощью 'Deep'.

  1. Первое появление любого нового идентификатора равно 0.
  2. Значение для регистра == upper будет 1, за которым следует все значение с добавлением до 1, пока идентификатор не изменится или другой идентификатор не будет найден.
  3. когда новый идентификатор найден, а регистр также является верхним, то в ситуации значение Deep будет равно 1, как, например, для 'ff', где значение равно 1.

Пожалуйста, помогите мне в этом

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Вот что-то в data.table:

library(data.table)
setDT(D1)
D1[, 
   deep := {
     tmp <- grep("up", case, ignore.case = TRUE)[1]
     if (is.na(tmp)) rep(0L, .N) else c(rep(0L, tmp-1L), seq_len(.N - tmp + 1L))
   } , 
   by = ID]

      ID case deep
 1: aa <NA>    0
 2: aa <NA>    0
 3: aa   Up    1
 4: aa <NA>    2
 5: cc <NA>    0
 6: cc <NA>    0
 7: dd <NA>    0
 8: dd <NA>    0
 9: dd   Up    1
10: dd <NA>    2
11: dd <NA>    3
12: dd <NA>    4
13: ee <NA>    0
14: ee <NA>    0
15: ee <NA>    0
16: ff   up    1
17: ff <NA>    2
18: gg <NA>    0

Данные

D1 <- data.frame(
  ID = c("aa", "aa", "aa", "aa", "cc", "cc", "dd", "dd", "dd", "dd", "dd", 
         "dd", "ee", "ee", "ee", "ff", "ff", "gg"), 
  case = c(NA, NA, "Up", NA, NA, NA, NA, NA, "Up", NA, NA, NA, NA, NA, NA, 
           "up", NA, NA) 
)
0 голосов
/ 15 января 2019

Мы группируем по 'ID', получаем кумулятивную сумму логического вектора, созданного с помощью str_detect, и переносим кумулятивную сумму, чтобы сложить 1 значения

library(tidyverse)
D1 %>% 
  group_by(ID) %>% 
  mutate(deep = cumsum(cumsum(str_detect(case, "[Uu]p") & !is.na(case))))
# A tibble: 18 x 3
# Groups:   ID [6]
#   ID    case   deep
#   <chr> <chr> <int>
# 1 aa    <NA>      0
# 2 aa    <NA>      0
# 3 aa    Up        1
# 4 aa    <NA>      2
# 5 cc    <NA>      0
# 6 cc    <NA>      0
# 7 dd    <NA>      0
# 8 dd    <NA>      0
# 9 dd    Up        1
#10 dd    <NA>      2
#11 dd    <NA>      3
#12 dd    <NA>      4
#13 ee    <NA>      0
#14 ee    <NA>      0
#15 ee    <NA>      0
#16 ff    up        1
#17 ff    <NA>      2
#18 gg    <NA>      0

данные

D1 <- structure(list(ID = c("aa", "aa", "aa", "aa", "cc", "cc", "dd", 
 "dd", "dd", "dd", "dd", "dd", "ee", "ee", "ee", "ff", "ff", "gg"
 ), case = c(NA, NA, "Up", NA, NA, NA, NA, NA, "Up", NA, NA, NA, 
 NA, NA, NA, "up", NA, NA)), class = "data.frame", row.names = c(NA, 
 -18L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...