R Tidy解决方案,可基于列的数据可用性从group_by输出中进行选择

时间:2019-05-30 17:50:44

标签: r tidyverse tidyr

我在df_pub(科学/自然出版数据)中有以下R dplyr数据帧

enter image description here

请注意,每行都有与主要作者相同的PMID(或论文)(此处未显示作者信息)。

我需要选择并存储未附加任何电子邮件的出版物(PMID),并将对它的最后观察结果存储在数据框中。

实际上,我想删除所有在任何观察结果中都有电子邮件的PMID。我需要收集没有附件电子邮件的出版物(PMID),然后找到最后的作者或最后的观察结果(通常她/他/她是小组负责人或PI,我们会手动与他们联系并要求他们更新他们的电子邮件)。

因此,对于上面的示例,预期的输出将不包含PMID 22522932,因为它附带了电子邮件。对于其他PMID,将仅存储每个此类PMID的最后一行。

我从此开始但后来迷路了

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

3 个答案:

答案 0 :(得分:1)

如果我理解正确,这将满足您的要求:

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

答案 1 :(得分:1)

我认为这就是您想要的。它会检查没有电子邮件的pmid,然后仅显示最后一行。

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

答案 2 :(得分:0)

尝试一下。可能不是最简洁的代码,但我认为它可以解决您的问题。

# 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