我在df_pub(科学/自然出版数据)中有以下R dplyr数据帧
请注意,每行都有与主要作者相同的PMID(或论文)(此处未显示作者信息)。
我需要选择并存储未附加任何电子邮件的出版物(PMID),并将对它的最后观察结果存储在数据框中。
实际上,我想删除所有在任何观察结果中都有电子邮件的PMID。我需要收集没有附件电子邮件的出版物(PMID),然后找到最后的作者或最后的观察结果(通常她/他/她是小组负责人或PI,我们会手动与他们联系并要求他们更新他们的电子邮件)。
因此,对于上面的示例,预期的输出将不包含PMID 22522932,因为它附带了电子邮件。对于其他PMID,将仅存储每个此类PMID的最后一行。
我从此开始但后来迷路了
df_pub %>%
group_by(pmid) %>%
filter(is.na(email)) # This does not do the expected
答案 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