Группировать, а затем мутировать

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

Это пример набора данных, который у меня есть:

Поэтому, если имя, клиника и год совпадают, я хочу, чтобы в проверяемом столбце было указано «да», если в любой другой строке этой группы указано «да».

Поэтому я бы хотел, чтобы набор данных в конечном итоге выглядел так:

Привет, Вики Лэтэм, добро пожаловать в SO. В будущем, пожалуйста, не делитесь изображениями данных по этим причинам . По этой ссылке есть действительно полезные рекомендации о том, как создать минимальный воспроизводимый пример (MRE) и, в частности, как поделиться данными примера. Спасибо

L Tyrone 25.02.2024 21:50

Я бы также предложил вместо "yes" и "no" использовать встроенные типы данных R и использовать TRUE и FALSE.

Mark 26.02.2024 01:37

вы хотите, чтобы они были сгруппированы по имени, клинике и году или только по имени и году?

Mark 26.02.2024 01:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это довольно просто, используя 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, который делает то же самое.

Josep Pueyo 26.02.2024 07:14

@JosepPueyo - эй, спасибо за обновление, очень ценно.

L Tyrone 29.02.2024 06:09

Другие вопросы по теме