2016-04-01 11 views
-2

Ich habe eine Nachschlagetabelle in R, die ich herausfinden möchte, wie zu implementieren. Die Herausforderung für mich besteht darin, dass es sich um kontinuierliche Werte oder Datenbereiche handelt. Wenn der Wert dazwischen fällt, möchte ich den richtigen Wert auswählen.Verwenden einer Nachschlagetabelle in R mit kontinuierlichen Werten

Ich möchte die zwei kontinuierlichen 'GRADE', 'SAT' Variablen plus den kategorischen 'TYPE' Wert verwenden, um einen 'GROUP' Wert zuzuweisen. Dieser große Code-Block wirkt einschüchternd, aber das sind winzige, winzige Tabellen.

Jeder Rat wird geschätzt !!!!

#lookup table code for recreating dataframe 
    structure(list(Type = structure(c(1L, 2L, 1L, 1L), .Label = c("A", 
"B"), class = "factor"), min_grade = c(93L, 85L, 93L, 80L), max_grade = c(100L, 
93L, 100L, 92L), min_sat = c(600L, 700L, 400L, 600L), max_sat = c(800L, 
800L, 599L, 800L), Group = structure(c(1L, 1L, 2L, 3L), .Label = c("A", 
"B", "C"), class = "factor")), .Names = c("Type", "min_grade", 
"max_grade", "min_sat", "max_sat", "Group"), class = "data.frame", row.names = c(NA, 
-4L)) 


#example ----- desired value is in the 'GROUP' column so this would be NULL before I used the lookup table 


      structure(list(Name = structure(c(3L, 1L, 2L, 4L), .Label = c("Jack", 
    "James", "John", "Jordan"), class = "factor"), Grade = c(95L, 
95L, 92L, 93L), Sat = c(701L, 500L, 800L, 800L), Type = structure(c(1L, 
1L, 1L, 2L), .Label = c("A", "B"), class = "factor"), Group = structure(c(1L, 
2L, 3L, 1L), .Label = c("A", "B", "C"), class = "factor")), .Names = c("Name", 
"Grade", "Sat", "Type", "Group"), class = "data.frame", row.names = c(NA, 
-4L)) 
+0

Unvollständige Problembeschreibung. Wenn Sie nur eine Tabelle mit mehreren Attributbereichen und einigen Fällen veröffentlichen, wird die erforderliche Logik nicht kommuniziert. –

Antwort

1

Wie geht das?

ltab <- structure(list(Type = structure(c(1L, 2L, 1L, 1L), .Label = c("A", 
    "B"), class = "factor"), min_grade = c(93L, 85L, 93L, 80L), max_grade = c(100L, 
    93L, 100L, 92L), min_sat = c(600L, 700L, 400L, 600L), max_sat = c(800L, 
    800L, 599L, 800L), Group = structure(c(1L, 1L, 2L, 3L), .Label = c("A", 
    "B", "C"), class = "factor")), .Names = c("Type", "min_grade", 
    "max_grade", "min_sat", "max_sat", "Group"), class = "data.frame", row.names = c(NA, 
    -4L)) 


dat <- structure(list(Name = structure(c(3L, 1L, 2L, 4L), .Label = c("Jack", 
    "James", "John", "Jordan"), class = "factor"), Grade = c(95L, 
    95L, 92L, 93L), Sat = c(701L, 500L, 800L, 800L), Type = structure(c(1L, 
    1L, 1L, 2L), .Label = c("A", "B"), class = "factor")), .Names = c("Name", 
    "Grade", "Sat", "Type"), class = "data.frame", row.names = c(NA, 
    -4L)) 

library(plyr) 
mdat <- adply(merge(dat, ltab, by="Type", all=T), 1, function(x) { 
    c(FallsIn=x$Grade > x$min_grade & x$Grade <= x$max_grade & x$Sat > x$min_sat & x$Sat <= x$max_sat) 
}) 
mdat[mdat$FallsIn,] 

über verallgemeinernde denken, sind es mehr kontinuierlichen Variablen zu gehen, die Sie überprüfen müssen?


EDIT: konnte OP Post nicht so bearbeiten OP Kommentar zu berücksichtigen ist, wie ich ein Beispiel für „Kategorisieren von mehrdimensionalen kontinuierlichen Zufallsvariablen“ angehen, so dass diese Keywords wird Fahne in Zukunft sucht

breaks <- list(Var1=c(0, 0.25, 1), 
    Var2=c(0, 0.5, 1), 
    Var3=c(0, 0.25, 0.75, 1)) 

#generate this on the fly 
genIntv <- function(x) { 
    ret <- paste0("(", x[1:(length(x)-1)],", ",x[2:length(x)], "]") 
    names(ret) <- 1:(length(x)-1) 
    ret 
} 
lookupTbl <- data.frame(expand.grid(lapply(breaks, genIntv), stringsAsFactors=F), 
    Group=LETTERS[1:12]) 
lookupTbl2 <- data.frame(expand.grid(lapply(breaks, function(x) 1:(length(x)-1)), stringsAsFactors=F), 
    Group=LETTERS[1:12]) 

#data set 
dat <- data.frame(Var1=c(0.1, 0.76), Var2=c(0.5, 0.75), Var3=c(0.25,0.9)) 
binDat <- do.call(cbind, setNames(lapply(1:ncol(dat), function(k) 
    .bincode(dat[,k], breaks[[k]], T, T)),colnames(dat))) 
merge(binDat, lookupTbl2, all.x=T, all.y=F) 

gut zu lernen, wenn jemand anderes bessere Ansätze hat

+0

ja potenziell, bis zu mehreren mehr. Es hängt wirklich davon ab, dass ich diese Art von Dingen in Zukunft in einer Vielzahl von Szenarien und Gruppen verwenden werde. – runningbirds

0

Wenn Sie kleine Daten haben, sollte eine vollständige Verknüpfung in Ordnung sein.

library(dplyr) 
result = 
    example %>% 
    select(-Type) %>% 
    full_join(look_up) %>% 
    filter(min_grade < Grade & Grade <= max_grade & 
      min_sat < Sat & Sat <= max_sat)