2016-04-01 4 views
-2

私は実装方法を理解しようとしているルックアップテーブルがRにあります。私の挑戦は、それが連続的な値やデータの範囲を含むことです。値がその間にある場合は、適切な値を選択したいと思います。Rのルックアップテーブルを連続した値で使用する

2つの連続した 'GRADE'、 'SAT'変数とカテゴリ 'TYPE'値を使用して 'GROUP'値を割り当てたいとします。この大きなコードブロックは脅威に見えますが、これらは非常に小さなテーブルです。

アドバイスありがとうございます。

#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

不完全な問題仕様。複数の属性範囲といくつかのケースのテーブルをポストするだけでは、必要なロジックを伝えません。 –

答えて

1

how abt this?

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,] 

一般化について考えると、チェックする必要があるより多くの連続変数がありますか?


EDIT:そう口座にOPのコメントを取っOPのポストを編集することができなかったことは、私が 「多次元連続確率変数の分類」の一例に取り組むだろうかあるので、これらのキーワード意志将来の検索のフラグアップ

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) 

他の誰かがより良いアプローチをしているかどうかを知ることは良いことです。

+0

はい、可能です。それは本当に私が様々なシナリオやグループでこの種のものを将来使用することに依存しています。 – runningbirds

0

小さなデータがある場合は完全結合が良いはずです。

library(dplyr) 
result = 
    example %>% 
    select(-Type) %>% 
    full_join(look_up) %>% 
    filter(min_grade < Grade & Grade <= max_grade & 
      min_sat < Sat & Sat <= max_sat) 
関連する問題