У меня есть набор данных, в котором я хочу выбирать только одну строку для каждого человека каждый год, однако я хотел бы изменить столбец так, чтобы, если он говорит «да» для любой из строк этих людей, тогда все строки говорили «да».
Это пример набора данных, который у меня есть:
Поэтому, если имя, клиника и год совпадают, я хочу, чтобы в проверяемом столбце было указано «да», если в любой другой строке этой группы указано «да».
Поэтому я бы хотел, чтобы набор данных в конечном итоге выглядел так:
Я бы также предложил вместо "yes" и "no" использовать встроенные типы данных R и использовать TRUE и FALSE.
вы хотите, чтобы они были сгруппированы по имени, клинике и году или только по имени и году?





Это довольно просто, используя dplyr. Вот вариант:
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
df <- tribble(
~ name, ~ clinic, ~ year, ~ date, ~ tested,
"a", "xxy", 2022, "April", "yes",
"a", "xxy", 2022, "May", "no",
"b", "ggf", 2019, "Jan", "no",
"b", "ggf", 2019, "Feb", "yes",
"c", "ffr", 2018, "March", "yes",
"c", "ffr", 2019, "May", "no"
)
df |>
mutate(tested2 = if_else(any(tested == "yes"), "yes", "no"), .by = c(name, year))
#> # A tibble: 6 × 6
#> name clinic year date tested tested2
#> <chr> <chr> <dbl> <chr> <chr> <chr>
#> 1 a xxy 2022 April yes yes
#> 2 a xxy 2022 May no yes
#> 3 b ggf 2019 Jan no yes
#> 4 b ggf 2019 Feb yes yes
#> 5 c ffr 2018 March yes yes
#> 6 c ffr 2019 May no no
Created on 2024-02-25 with reprex v2.1.0
Я бы порекомендовал прочитать этот вопрос, прежде чем публиковать будущие вопросы. Так вам будет легче помочь.
Я включил еще одного пациента, который посетил две разные клиники, чтобы продемонстрировать, что происходит и в этих случаях. Это dplyr решение работает, проверяя, являются ли значения any() в каждом group_by() «да», а затем изменяет проверенные значения, если они верны.
library(dplyr)
df <- data.frame(name = paste0("patient ", rep(c("x", "xy", "xyz", "abc"), each = 2)),
clinic = c(rep(c("xxy", "ggf", "ffr"), each = 2), "hhx", "hhy"),
year = c(rep(c(2022, 2019), each = 2), 2018, 2019, 2017, 2017),
date = month.name[c(4,5,1,2,3,5,6,7)],
tested = c("yes", "no", "no", "yes", "yes", "no", "yes", "no"))
result <- df %>%
group_by(name, clinic, year) %>%
mutate(tested = case_when(any(tested == "yes") ~ "yes", TRUE ~ tested)) %>%
ungroup()
result
# A tibble: 8 × 5
name clinic year date tested
<chr> <chr> <dbl> <chr> <chr>
1 patient x xxy 2022 April yes
2 patient x xxy 2022 May yes
3 patient xy ggf 2019 January yes
4 patient xy ggf 2019 February yes
5 patient xyz ffr 2018 March yes
6 patient xyz ffr 2019 May no
7 patient abc hhx 2017 June yes
8 patient abc hhy 2017 July no
Почему вы используете case_when, если используете только два варианта? Есть ли какое-то преимущество в использовании if_else? Вы могли бы сделать if_else(any(tested == "yes"), "yes", tested)). Кстати, случай TRUE в case_when больше не рекомендуется, так как добавлен аргумент .default, который делает то же самое.
@JosepPueyo - эй, спасибо за обновление, очень ценно.
Привет, Вики Лэтэм, добро пожаловать в SO. В будущем, пожалуйста, не делитесь изображениями данных по этим причинам . По этой ссылке есть действительно полезные рекомендации о том, как создать минимальный воспроизводимый пример (MRE) и, в частности, как поделиться данными примера. Спасибо