Прилагаю полные данные:
id = c (2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2)
vm = c("12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24")
GE = c("0", "0", "0", "0", "0", "0", "1", "0", "1", "0", "1","0", "1")
status = c("noinfection", "noinfection", "noinfection", "noinfection", "noinfection", "noinfection", "infection", "noinfection", "infection", "noinfection", "infection", "noinfection", "infection")
fichier <- data.frame(id, vm, GE, status)
У нас уже есть значения переменной GE при посещениях в 18 и 24 месяца. Невозможно удалить их из нашего набора данных. Как я могу изменить эти значения, чтобы они учитывали предыдущие посещения?
GE = 0, если стоимость всех предыдущих посещений равна 0.
GE = 1, если хотя бы одно из предыдущих посещений стоило 1.
Нет, есть вм=18 и вм=24. Необходимо, чтобы на вм 18 мы имели значения ГЭ предыдущих посещений (с 12 по 17) и чтобы на вм 24 имели значения ГЭ предыдущего посещения (с 19 по 23).
Вариант ответа на ваш предыдущий вопрос, сначала значения 18 и 24 для vm заменяются на NA, затем вычисляется столбец статуса:
Сценарий 1:
library(dplyr)
library(tidyr)
id <- c (2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2)
vm <- c("12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24")
GE <- c("0", "0", "0", "0", "0", "0", "1", "0", "1", "0", "1","0", "1")
status <- c("noinfection", "noinfection", "noinfection", "noinfection", "noinfection", "noinfection", "infection", "noinfection", "infection", "noinfection", "infection", "noinfection", "infection")
fichier <- data.frame(id, vm, GE, status)
fichier <- fichier |>
mutate(across(c(vm, GE), as.integer)) |>
group_by(id) |> # assuming your data may have multiple id values
mutate(tmp = if_else(vm <= 18, 1, 2)) |>
group_by(id, tmp) |>
mutate(GE = if_else(vm %in% c(18, 24), NA, GE),
GE = case_when(is.na(GE) & sum(GE, na.rm = TRUE) == 0 ~ 0,
is.na(GE) & sum(GE, na.rm = TRUE) > 0 ~ 1,
.default = GE),
status = if_else(GE == 1, "infection", "noinfection")) |>
ungroup() |>
select(-starts_with("tmp"))
fichier
# # A tibble: 13 × 4
# id vm GE status
# <dbl> <int> <dbl> <chr>
# 1 2 12 0 noinfection
# 2 2 13 0 noinfection
# 3 2 14 0 noinfection
# 4 2 15 0 noinfection
# 5 2 16 0 noinfection
# 6 2 17 0 noinfection
# 7 2 18 0 noinfection
# 8 2 19 0 noinfection
# 9 2 20 1 infection
# 10 2 21 0 noinfection
# 11 2 22 1 infection
# 12 2 23 0 noinfection
# 13 2 24 1 infection
Не знаю, как вас благодарить, посмотрю, сработает ли это, и подтвержу!
Работает, СПАСИБО, хороших выходных!
Отлично, это именно то, что я хотел, большое спасибо за помощь!
Вот решение.
Код ниже сначала создает группирующую переменную, сообщающую, находимся ли мы в сегментах «до "18"
» и «до "24"
» vm
. Затем он проверяет предыдущие значения vm
на наличие 1
и присваивает результат GE
.
Кроме того, гораздо проще обрабатывать числа, поэтому GE
принудительно перемещается в класс "integer"
и обратно.
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
id = c (2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2)
vm = c("12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24")
GE = c("0", "0", "0", "0", "0", "0", "1", "0", "1", "0", "1","0", "1")
status = c("noinfection", "noinfection", "noinfection", "noinfection", "noinfection", "noinfection", "infection", "noinfection", "infection", "noinfection", "infection", "noinfection", "infection")
fichier <- data.frame(id, vm, GE, status)
fichier %>%
mutate(
GE = as.integer(GE),
vm_grp = vm %in% c("18", "24"),
vm_grp = rev(cumsum(rev(vm_grp)))
) %>%
mutate(
GE = ifelse(vm %in% c("18", "24"), any(lag(GE, default = 0) == 1), GE),
GE = as.character(as.integer(GE)),
.by = c(id, vm_grp)
) %>%
select(-vm_grp)
#> id vm GE status
#> 1 2 12 0 noinfection
#> 2 2 13 0 noinfection
#> 3 2 14 0 noinfection
#> 4 2 15 0 noinfection
#> 5 2 16 0 noinfection
#> 6 2 17 0 noinfection
#> 7 2 18 0 infection
#> 8 2 19 0 noinfection
#> 9 2 20 1 infection
#> 10 2 21 0 noinfection
#> 11 2 22 1 infection
#> 12 2 23 0 noinfection
#> 13 2 24 1 infection
Created on 2024-07-27 with reprex v2.1.0
СПАСИБО большое за ответ, хороших выходных!
Ведь
vm == "18"
всеGE
есть"1"
?