У меня есть очень большой фрейм данных с fi sh видами, захваченными в качестве одного из столбцов. Вот очень сокращенный пример:
ID = seq(1,50,1)
fishes = c("bass", "jack", "snapper")
common = sample(fishes, size = 50, replace = TRUE)
dat = as.data.frame(cbind(ID, common))
Я хочу удалить любые виды, которые составляют менее определенного процента данных. Например, здесь я хочу удалить все виды, которые составляют менее 30% данных:
library(dplyr)
nrow(filter(dat, common == "bass")) #22 rows -> 22/50 -> 44%
nrow(filter(dat, common == "jack")) #12 rows -> 12/50 -> 24%
nrow(filter(dat, common == "snapper")) #16 rows -> 16/50 -> 32%
Здесь гнезда составляют менее 30% строк, поэтому я хочу удалить все ряды с гнездами (или все виды с менее чем 15 рядами). Это легко сделать здесь, но на самом деле у меня есть более 700 видов sh в моем фрейме данных, и я хочу выбросить все виды, которые составляют менее 1% данных (что в моем случае было бы меньше, чем 18 003 строки). Есть ли рациональный способ сделать это без необходимости отфильтровывать каждый вид отдельно?
Я представляю, возможно, что-то вроде l oop, которое говорит, что если число строк для общего имени = "x" меньше 18003, удалите эти строки ...