2016-05-30 24 views
0

Wie kann ich das mit R machen? Ich habe einen Datenrahmen df.Tabellenspalte basierend auf einer anderen Tabelle klassifizieren

id volume 
1 139 
2 139 
3 133 
4 100 
5 NA 
6 145 

Und ich habe eine Tabelle Klassifizierung tb:

min max class 
100 110 class1 
110 120 class2 
120 130 class3 
130 140 class4 
140 150 class5 

In Folge muss ich Tisch wie diese df_new:

id volume class 
1 139 class4 
2 139 class4 
3 133 class4 
4 100 class1 
5 NA NA 
6 145 class5 

Antwort

1

Es ist unklar, was passieren soll, wenn volume ist, beispielsweise gleich 110, aber vielleicht:

DF <- read.table(text = "id volume 
       1 139 
       2 139 
       3 133 
       4 100 
       5 NA 
       6 145", header = TRUE) 

classes <- read.table(text = "min max class 
         100 110 class1 
         110 120 class2 
         120 130 class3 
         130 140 class4 
         140 150 class5", header = TRUE) 

DF$class <- classes$class[findInterval(DF$volume, c(classes$min, tail(classes$max, 1)))] 
# id volume class 
#1 1 139 class4 
#2 2 139 class4 
#3 3 133 class4 
#4 4 100 class1 
#5 5  NA <NA> 
#6 6 145 class5 
+1

Vielen Dank, es funktioniert ! Ist es richtig __tail (DF $ max, 1) __ oder soll es so aussehen __tail (Klassen $ max, 1) __? – makbuk

1

Wir verwenden cut

df$class <- cut(df$volume, breaks = unique(unlist(tb[1:2])), 
          labels = tb$class, include.lowest=TRUE) 
df 
# id volume class 
#1 1 139 class4 
#2 2 139 class4 
#3 3 133 class4 
#4 4 100 class1 
#5 5  NA <NA> 
#6 6 145 class5 
0

Oder sqldf Paket und ein einfaches join mit:

sqldf("SELECT df.id, df.volume, tb.class 
      FROM df LEFT OUTER JOIN tb 
       ON (df.volume>=tb.min AND df.volume<tb.max)") 

    # id volume class 
# 1 1 139 class4 
# 2 2 139 class4 
# 3 3 133 class4 
# 4 4 100 class1 
# 5 5  NA <NA> 
# 6 6 145 class5 
+0

Vielen Dank für einen anderen Weg, es ist nützlich. – makbuk

Verwandte Themen