【问题标题】:filter rows based on group with multiple conditions in R基于R中具有多个条件的组过滤行
【发布时间】: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"))

我需要做的是按IDSciName 对列进行分组,然后保留以下行:

  1. 如果组里只有一行,不管是什么状态都保留它
  2. 如果行数超过两行,则保留接受的同义词和同义词
  3. 如果没有被接受且同义词保持未解决,如果没有未解决保持误用

我尝试使用 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


【解决方案1】:

我认为这会起作用,但需要更高质量的测试集才能确定。

keep.plantlist <- plantlist %>% 
  group_by(ID, SciName) %>% 
  mutate(count = n()) %>% 
  mutate(keep = case_when(
    count == 1  ~ T ,
    count > 1 & STATUS == "Accepted" ~ T, 
    count > 1 & STATUS == "Synonym" ~ T,
    !any(STATUS %in% c("Accepted", "Synonym")) &
      STATUS %in% "Unresolved" ~ TRUE,
    !any(STATUS %in% c("Accepted", "Synonym", "Unresolved")) &
      STATUS %in% "Misapplied" ~ TRUE,
    TRUE ~ FALSE
  ))

【讨论】:

    猜你喜欢
    • 2022-07-21
    • 1970-01-01
    • 2019-10-28
    • 2019-09-10
    • 2018-06-23
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    相关资源
    最近更新 更多