R Аккуратное решение для выбора из вывода group_by на основе доступности данных столбца

У меня есть следующий фрейм данных R dplyr в df_pub (данные публикации науки/природы)

R Аккуратное решение для выбора из вывода group_by на основе доступности данных столбца

Обратите внимание, что в каждой строке есть один и тот же PMID (или статья) с участвующими авторами (информация об авторах здесь не отображается).

Мне нужно выбрать и сохранить публикации (PMID), к которым не прикреплена электронная почта, и сохранить последнее наблюдение за ними в фрейме данных.

На самом деле я хочу удалить все PMID, имеющие электронную почту в любом наблюдении. Мне нужно собрать публикации (PMID), к которым не прикреплен адрес электронной почты, а затем найти последнего автора или последнее наблюдение (обычно она/он/xe является лидером группы или PI, мы свяжемся с ними вручную и попросим их обновите свою электронную почту).

Таким образом, для приведенного выше примера ожидаемый результат не будет содержать PMID 22522932, поскольку к нему прикреплено электронное письмо. Для других PMID будет сохранена только последняя строка каждого такого PMID.

Я начал с этого, но потом потерял

df_pub %>%
  group_by(pmid) %>%
  filter(is.na(email)) # This does not do the expected

Без воспроизводимый пример я не знаю, почему этот код не сработал бы.

camille 30.05.2019 20:11

Это может помочь: nsaunders.wordpress.com/2013/02/13/…

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

Ответы 3

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

Если я правильно понимаю, это будет делать то, что вы хотите:

df_pub %>% 
  group_by(pmid) %>% 
  filter(!any(!is.na(email)),
         row_number() == n()) 

Спасибо! Я не знаю, как вы поняли проблему из моего очень паршивого описания. Торты и печенье.

ghosh'. 30.05.2019 20:24

Вы хотите сохранить последнее наблюдение в группе а потом и удалить PMID с электронными письмами? Таким образом, если последнее наблюдение в группе (PMID) имеет адрес электронной почты, этот PMID не будет включен в окончательный набор данных. Я отредактировал ответ, чтобы отразить это.

Giovanni Colitti 30.05.2019 20:29

На самом деле я хочу удалить все PMID, имеющие электронную почту в любом наблюдении. Мне нужно собрать публикации (PMID), к которым не прикреплен адрес электронной почты, а затем найти последнего автора или последнее наблюдение (обычно она/он/xe является лидером группы или PI, мы свяжемся с ними вручную и попросим их обновите свою электронную почту).

ghosh'. 30.05.2019 20:36

Я думаю, @jorge-mendes предоставил правильное решение. Итак, я отмечаю их ответ как правильный.

ghosh'. 30.05.2019 20:43

Я снова обновил ответ. Дайте мне знать, если вы этого хотите.

Giovanni Colitti 30.05.2019 20:47

Спасибо. Да, и ваше решение, и решение Хорхе Мендеса работают и дают одинаковый результат. Я не эксперт, который может сказать, какое решение более аккуратное, чем другое.

ghosh'. 30.05.2019 20:51

Определенно мой.

Giovanni Colitti 30.05.2019 20:54

да. Это ваше. Потому что это делается в одном фильтрующем запросе.

ghosh'. 30.05.2019 20:58

Попробуй это. Возможно, это не самый краткий код, но я думаю, что он решает ваш вопрос.

# Sample dataframe
  pmid   email No
1    1    <NA>  1
2    1    <NA>  2
3    1    <NA>  3
4    2 [email protected]  4
5    2    <NA>  5

# Logic
val <- df$pmid[!is.na(df$email)] %>% unique()
df[!df$pmid %in% val, ] %>% 
  group_by(pmid) %>% 
  slice(n()) %>% 
  ungroup()

# Result
# A tibble: 2 x 3
   pmid email      No
  <dbl> <fct>   <int>
1     1 NA          3

Спасибо. Хорхе Мендес предоставил элегантный аккуратный код.

ghosh'. 30.05.2019 20:46

Я думаю, это то, что вы хотели. Он проверяет, к каким pmids не прикреплена электронная почта, а затем показывает только последнюю строку.

df_pub %>% 
    group_by(pmid) %>% 
    filter(sum(is.na(email)) == n()) %>% #chooses pmids that number of NAs equals number os rows
    filter(row_number() == n()) #chooses the last row for each pmid

Это правильное решение. Браво. Я все еще озадачен тем, как вы трое поняли, о чем я просил. Спасибо.

ghosh'. 30.05.2019 20:44

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