Добавьте флаг, который удовлетворяет определенным условиям во фрейме данных
Для каждого субъекта, если 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