R Tidy решение для выбора из вывода group_by на основе доступности данных столбца - PullRequest
0 голосов
/ 30 мая 2019

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

enter image description here

Обратите внимание, что существуют одинаковые 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

Ответы [ 3 ]

1 голос
/ 30 мая 2019

Я думаю, это то, что вы хотели. Он проверяет, к каким 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
1 голос
/ 30 мая 2019

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

df_pub %>% 
  group_by(pmid) %>% 
  filter(!any(!is.na(email)),
         row_number() == n()) 
0 голосов
/ 30 мая 2019

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

# Sample dataframe
  pmid   email No
1    1    <NA>  1
2    1    <NA>  2
3    1    <NA>  3
4    2 a@b.com  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
...