Условное утверждение в группе - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть фрейм данных, в котором я хочу создать новый столбец со значениями, основанными на условии внутри групп.Поэтому для приведенного ниже кадра данных я хочу создать новый столбец n_actions, который дает

Cond1.для всей группы GROUP число 2, если 6 появляется в столбце STEP Cond 2. для всей группы GROUP число 3, если 9 появляется в столбце STEP Cond 3., если не указано 6 или 9 в столбце STEP для группы,затем 1

#dataframe start
dataframe <- data.frame(group = c("A", "A", "A", "B", "B", "B", "B", "B", "B", "C", "C", "C", "D", "D", "D", "D", "D", "D", "D", "D", "D"),
               step = c(1, 2, 3, 1, 2, 3, 4, 5, 6, 1, 2, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9))

# dataframe desired
dataframe$n_actions <- c(rep(1, 3), rep(2, 6,), rep(1, 3), rep(3, 9))

Ответы [ 3 ]

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

Попробуйте:

library(dplyr)
dataframe %>% 
        group_by(group) %>%
        mutate(n_actions = ifelse(9 %in% step, 3, 
                                  ifelse(6 %in% step, 2, 1)))
# A tibble: 21 x 3
# Groups:   group [4]
    group  step n_actions
   <fctr> <dbl>     <dbl>
 1      A     1         1
 2      A     2         1
 3      A     3         1
 4      B     1         2
 5      B     2         2
 6      B     3         2
 7      B     4         2
 8      B     5         2
 9      B     6         2
10      C     1         1
# ... with 11 more rows
0 голосов
/ 03 декабря 2018

Другой способ с dplyr case_when:

library(dplyr)

dataframe %>% 
  group_by(group) %>%
  mutate(
    n_actions1 = case_when(
      9 %in% step ~ 3,
      6 %in% step ~ 2,
      TRUE ~ 1
    )
  )

Выход:

# A tibble: 21 x 3
# Groups:   group [4]
   group  step n_actions
   <fct> <dbl>     <dbl>
 1 A         1         1
 2 A         2         1
 3 A         3         1
 4 B         1         2
 5 B         2         2
 6 B         3         2
 7 B         4         2
 8 B         5         2
 9 B         6         2
10 C         1         1
11 C         2         1
12 C         3         1
13 D         1         3
14 D         2         3
15 D         3         3
16 D         4         3
17 D         5         3
18 D         6         3
19 D         7         3
20 D         8         3
21 D         9         3
0 голосов
/ 03 декабря 2018

Вы могли бы разделить максимальное значение на группу на %/% 3, кажется.

dataframe <- transform(dataframe,
                       n_actions2 = ave(step, group, FUN = function(x) max(x) %/% 3))
dataframe
#   group step n_actions n_actions2
#1      A    1         1          1
#2      A    2         1          1
#3      A    3         1          1
#4      B    1         2          2
#5      B    2         2          2
#6      B    3         2          2
#7      B    4         2          2
#8      B    5         2          2
#9      B    6         2          2
#10     C    1         1          1
#11     C    2         1          1
#12     C    3         1          1
#13     D    1         3          3
#14     D    2         3          3
#15     D    3         3          3
#16     D    4         3          3
#17     D    5         3          3
#18     D    6         3          3
#19     D    7         3          3
#20     D    8         3          3
#21     D    9         3          3
...