Мы можем сделать это в base R
с
n1 <- sum(csss$csa %in% z)
csss$new.csa <- c("A", "B")[(n1 <=200) + 1]
, если условие основано на levels
на 'csa'
n1 <- sum(levels(csss$csa) %in% z)
Если этоосновано на количестве наблюдений на каждую группу, опция base R
будет
nm1 <- names(which(table(csss$csa) > 200))
df1$new.csa <- c("B", "A")[(csss$csa %in% nm1) + 1]
Обновление
На основании обновления в посте ОП, это можно сделать с помощью cut
или findInterval
tbl <- table(csss$csa)
nm1 <- as.character(cut(tbl, breaks = c(-Inf, 25, 60, 99, 152, Inf),
labels = LETTERS[1:5]))
csss$new.csa <- setNames(nm1, names(tbl))[csss$csa]
данные
set.seed(24)
csss <- data.frame(csa = sample(c("SFRROC916","SANGEO512","SFRPAL650","HARSPR413",
"HARSPR412",
"SFROC197", "SANGEO514", "SGFG0984", "SAND942"),
1000, replace = TRUE, prob = c(0.02, 0.1, 0.1, 0.1, 0.2, 0.2, 0.2,
0.4, 0.4)), col2 = rnorm(1000), stringsAsFactors = FALSE)