заполнить столбец на основе другого столбца относительно значения в строке и следующих строках в R - PullRequest
0 голосов
/ 14 апреля 2020

Допустим, у меня есть 3 столбца. первый столбец user, данные которого должны быть сгруппированы по нему. каждый user может иметь несколько session. У меня есть столбец action с некоторыми значениями и NA s, которые я хочу заполнить на основе session и `` user:

для каждого пользователя, заполняйте столбец action его значением, пока либо из двух условий:

1 - заполняйте до тех пор, пока не наберете session+1 число. Это означает, что если action == A and session==2 заполнить все NA значения A до session 4, включая session 2 и 3.

ИЛИ

2- до достижения нового action значение в пределах session+1. В этом случае новое значение начинает заполняться до его session +1

df<-read.table(text="
user    session    action
1          1        NA
1          1        A
1          1        NA
1          1        B
1          2        NA
1          2        NA
1          3        NA  
2          1        AA
2          1        NA
2          1        NA
2          2        NA
2          3        NA
2          4        AA
2          5        NA
2          6        NA
2          7        AA
2          8        NA",header=T, stringsAsFactors = FALSE)

результата: (я выделил затронутые строки)

user    session    action
    1          1        NA
    1          1        A
    1          1        A  <--
    1          1        B
    1          2        B  <--
    1          2        B  <--
    1          3        NA  
    2          1        AA
    2          1        AA <--
    2          1        AA <--
    2          2        AA <--
    2          3        NA
    2          4        AA
    2          5        AA <--
    2          6        NA
    2          7        AA
    2          8        AA <--

1 Ответ

1 голос
/ 14 апреля 2020

Вот обратный подход. Мы fill все action значения сначала для каждого user, а затем изменим эти значения на NA, где session count больше 2 для каждого action.

library(dplyr)

df %>%
  group_by(user) %>%
  mutate(grp = cumsum(!is.na(action))) %>%
  tidyr::fill(action) %>%
  group_by(grp, add = TRUE) %>%
  mutate(temp = replace(action, cumsum(!duplicated(session)) > 2, NA)) %>%
  ungroup() %>%
  select(-grp)

#    user session action temp 
#   <int>   <int> <chr>  <chr>
# 1     1       1 NA     NA   
# 2     1       1 A      A    
# 3     1       1 A      A    
# 4     1       1 B      B    
# 5     1       2 B      B    
# 6     1       2 B      B    
# 7     1       3 B      NA   
# 8     2       1 AA     AA   
# 9     2       1 AA     AA   
#10     2       1 AA     AA   
#11     2       2 AA     AA   
#12     2       3 AA     NA   
#13     2       4 AA     AA   
#14     2       5 AA     AA   
#15     2       6 AA     NA   
#16     2       7 AA     AA   
#17     2       8 AA     AA   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...