[Aktualizacja komentarzu op i zmienionym 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)
użyciem powyższych ramek danych, można wykonać scalenie bazie danych. Musisz ustawić lookup
dla żądanych kombinacji, co jest w porządku, jeśli nie ma zbyt dużej liczby Name
s (Przynajmniej musisz podać je po każdym w lookup
i nie musisz zrobić to w porządku - lista wszystkich Cat1
Name
ów pierwszy, etc):
> 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
Jedną z opcji jest indeksowanie:
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))
}
alternatywą że skala Lepiej jest,
bar <- function(x, cats = c("Ones", "Tens", "Hundreds", "Thousands")) {
out <- cats[floor(log10(x)) + 1]
factor(out, levels = cats)
}
+1 Przyjemne użycie 'Map()'. To już drugi raz w tygodniu, że ktoś tutaj użył 'Map()' w odpowiedzi i wygląda na to, że jest bardzo przydatny. –
@Gavin dzięki. Właściwie ten drugi post nauczył mnie o Mapie! –
@pchalasani Dzięki temu to dobry sposób na przekodowanie. Jednak próbowałem tego, a mapowanie jest jakoś nie tak, kiedy zrobiłem to w moich rzeczywistych danych. Przykład, który dajesz, działa dobrze. Jakiekolwiek możliwe przyczyny tego? – sfactor