[Обновить после комментария ОП и изменить Q]
DF <- data.frame(Name = c("A","C","D","E","H","Z","M"),
Count = c(100,10,40,30,3,20,50), stringsAsFactors = FALSE)
lookup <- data.frame(Name = c("A","C","D","E","H","Z","M"),
Category = paste("Cat", c(1,2,1,3,3,2,10), sep = ""),
stringsAsFactors = FALSE)
Используя вышеупомянутые фреймы данных, мы можем выполнить слияние базы данных. Вам нужно настроить lookup
для нужных комбинаций Name
Category
, что нормально, если не очень большое количество Name
с (по крайней мере, вам нужно перечислить их только один раз в lookup
и вам не нужно делать это по порядку - сначала перечислите все Cat1
Name
с и т. Д.):
> merge(DF, lookup, by = "Name")
Name Count Category
1 A 100 Cat1
2 C 10 Cat2
3 D 40 Cat1
4 E 30 Cat3
5 H 3 Cat3
6 M 50 Cat10
7 Z 20 Cat2
> merge(DF, lookup, by = "Name", sort = FALSE)
Name Count Category
1 A 100 Cat1
2 C 10 Cat2
3 D 40 Cat1
4 E 30 Cat3
5 H 3 Cat3
6 Z 20 Cat2
7 M 50 Cat10
Один из вариантов индексации:
foo <- function(x) {
out <- character(length = length(x))
chars <- c("Ones", "Tens", "Hundreds", "Thousands")
out[x < 10] <- chars[1]
out[x >= 10 & x < 100] <- chars[2]
out[x >= 100 & x < 1000] <- chars[3]
out[x >= 1000 & x < 10000] <- chars[4]
return(factor(out, levels = chars))
}
Альтернатива, которая лучше масштабируется:
bar <- function(x, cats = c("Ones", "Tens", "Hundreds", "Thousands")) {
out <- cats[floor(log10(x)) + 1]
factor(out, levels = cats)
}