【发布时间】:2022-01-22 02:48:06
【问题描述】:
我正在研究植物学名的数据框,其样本如下:
plantlist <- data.frame(ID = c(1,2,2,2,2,2,2),
SciName = c("Alkanna tuberculata", "Alkanna tuberculata", "Anchusa tinctoria", "Anchusa tinctoria", "Anchusa tinctoria", "Anchusa tinctoria", "Echium italicum"),
SciName.w.author = c("Alkanna tuberculata Greuter", "Alkanna tuberculata Meikle", "Anchusa tinctoria L", "Anchusa tinctoria Woodv", "Anchusa tinctoria Pall", "Anchusa tinctoria Meikle", "Echium italicum"),
Status = c("Unresolved", "Misapplied", "Accepted", "Synonym", "Unresolved", "Synonym", "Misapplied"))
我需要做的是按ID 和SciName 对列进行分组,然后保留以下行:
- 如果组里只有一行,不管是什么状态都保留它
- 如果行数超过两行,则保留接受的同义词和同义词
- 如果没有被接受且同义词保持未解决,如果没有未解决保持误用
我尝试使用 case_when 和分组来完成此操作,但我被困在最后一部分
keep.plantlist <- plantlist %>%
group_by(ID, SciName) %>%
mutate(count = n()) %>%
ungroup()%>%
mutate(keep = case_when(count == 1 ~ T ,
count > 1 & STATUS == "Accepted" ~ T,
count > 1 & STATUS == "Synonym" ~ T))
#expected keep row
plantlist$keep <- c(T, F, T, T, F, T, T)
我还尝试将状态作为因素进行变异并按我需要的优先级排列组,但我不知道如果我有这个顺序是否有任何功能可以提供帮助。
【问题讨论】:
-
请给出预期结果
keep.plantlist用于基准测试。 -
据我所知,此输入的预期结果对所有内容都是 TRUE。请编辑您的示例以包含一些错误的情况,并显示预期的输出。
-
@Gregor Thomas 每组有不同的行组合(每组最多 17 行)。例如,可能有接受的行和误用的行,或者三个甚至四个的组合。对于这样的组,我只想保留接受的同义词和同义词(如果有的话),并省略误用或未解决的。
-
@Gregor Thomas 是的,你是对的。这不是一个好的样本。我编辑了样本
-
@Peace Wang 谢谢你的建议。我添加了预期的行。
标签: r dataframe dplyr filter group-by