根据另一个 table 对 table 列进行分类

Classify table column based on another table

我如何使用 R 执行此操作?我有一个数据框 df.

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

我有一个分类table tb:

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

结果我需要这样 table df_new:

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

我们可以使用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

不清楚如果 volume 等于 110 会发生什么,但也许是这样:

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

或者使用 sqldf 包和一个简单的 join:

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