根据另一个 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
我如何使用 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