Добавьте флаг, который удовлетворяет определенным условиям во фрейме данных

Для каждого субъекта, если Cmax или AUC равен нулю, тогда FLAG должен быть равен 0. Если оба равны 1, тогда FLAG=1.

SUB    METRIC    BE    FLAG
 1      Cmax     0       NA
 1      AUC      1       NA
 2      Cmax     1       NA
 2      AUC      1       NA
 3      Cmax     1       NA
 3      AUC      1       NA
 4      Cmax     1       NA
 4      AUC      0       NA

Вывод должен быть таким:

SUB    METRIC    BE     FLAG
 1      Cmax     0       0
 1      AUC      1       0
 2      Cmax     1       1
 2      AUC      1       1
 3      Cmax     1       1
 3      AUC      1       1
 4      Cmax     1       0
 4      AUC      0       0

Тогда я хочу взять сумму FLAG, но FLAG = 1 для уникального предмета нужно добавить один раз, потому что это тот же предмет. Итак, сумма для FLAG в вышеупомянутом должна быть равна 2, а не 4. Я использую RStudio.

2 ответа

Мы можем использовать логическое условие после группировки по 'SUB'

library(dplyr)
df1 %>%
  group_by(SUB) %>% 
  mutate(FLAG = as.integer(all(BE[METRIC %in% c("Cmax", "AUC")]==1)))
# A tibble: 8 x 4
# Groups:   SUB [4]
#    SUB METRIC    BE  FLAG
#  <int>  <chr> <int> <int>
#1     1   Cmax     0     0
#2     1    AUC     1     0
#3     2   Cmax     1     1
#4     2    AUC     1     1
#5     3   Cmax     1     1
#6     3    AUC     1     1
#7     4   Cmax     1     0
#8     4    AUC     0     0

Я думаю, что akruns ответ более элегантный, но вот мой подход с использованием dplyrs case_when():

dat %>% 
  group_by(SUB) %>% 
  mutate(
    FLAG = case_when(
      sum(BE) < length(BE)  ~ 0,
      sum(BE) == length(BE) ~ 1
    ))
# A tibble: 8 x 4
# Groups:   SUB [4]
#    SUB METRIC    BE  FLAG
#  <dbl>  <chr> <dbl> <dbl>
#1     1   Cmax     0     0
#2     1    AUC     1     0
#3     2   Cmax     1     1
#4     2    AUC     1     1
#5     3   Cmax     1     1
#6     3    AUC     1     1
#7     4   Cmax     1     0
#8     4    AUC     0     0

Тогда вы можете использовать summarise() функции, чтобы взять максимум FLAGи суммировать SUB_FLAG, Сумма SUB_FLAG тогда 2.

dat %>% 
  group_by(SUB) %>% 
  mutate(
    FLAG = case_when(
      sum(BE) < length(BE)  ~ 0,
      sum(BE) == length(BE) ~ 1
      )
  ) %>%
  summarise(SUB_FLAG = max(FLAG)) %>% 
  summarise_at("SUB_FLAG", sum)
# A tibble: 1 x 1
#  SUB_FLAG
#      <dbl>
#1        2
Другие вопросы по тегам