我正在研究植物學名的資料框,其樣本如下:
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)
我還嘗試將狀態作為因素進行變異,并按我需要的優先級排列組,但我不知道如果我有這個順序,是否有任何功能可以提供幫助。
uj5u.com熱心網友回復:
我認為這會起作用,但需要更高質量的測驗集才能確定。
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
))
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/418377.html
標籤:
下一篇:如果列名包含數字,如何選擇列?
