У меня есть следующий фрейм данных R dplyr в df_pub (данные публикации науки/природы)
Обратите внимание, что в каждой строке есть один и тот же 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
Это может помочь: nsaunders.wordpress.com/2013/02/13/…
Если я правильно понимаю, это будет делать то, что вы хотите:
df_pub %>%
group_by(pmid) %>%
filter(!any(!is.na(email)),
row_number() == n())
Спасибо! Я не знаю, как вы поняли проблему из моего очень паршивого описания. Торты и печенье.
Вы хотите сохранить последнее наблюдение в группе а потом и удалить PMID с электронными письмами? Таким образом, если последнее наблюдение в группе (PMID) имеет адрес электронной почты, этот PMID не будет включен в окончательный набор данных. Я отредактировал ответ, чтобы отразить это.
На самом деле я хочу удалить все PMID, имеющие электронную почту в любом наблюдении. Мне нужно собрать публикации (PMID), к которым не прикреплен адрес электронной почты, а затем найти последнего автора или последнее наблюдение (обычно она/он/xe является лидером группы или PI, мы свяжемся с ними вручную и попросим их обновите свою электронную почту).
Я думаю, @jorge-mendes предоставил правильное решение. Итак, я отмечаю их ответ как правильный.
Я снова обновил ответ. Дайте мне знать, если вы этого хотите.
Спасибо. Да, и ваше решение, и решение Хорхе Мендеса работают и дают одинаковый результат. Я не эксперт, который может сказать, какое решение более аккуратное, чем другое.
Определенно мой.
да. Это ваше. Потому что это делается в одном фильтрующем запросе.
Попробуй это. Возможно, это не самый краткий код, но я думаю, что он решает ваш вопрос.
# 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
Спасибо. Хорхе Мендес предоставил элегантный аккуратный код.
Я думаю, это то, что вы хотели. Он проверяет, к каким 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
Это правильное решение. Браво. Я все еще озадачен тем, как вы трое поняли, о чем я просил. Спасибо.
Без воспроизводимый пример я не знаю, почему этот код не сработал бы.