我怎么能用R做到这一点?我有一个数据框 df 。
id volume
1 139
2 139
3 133
4 100
5 NA
6 145
我有一个分类表 tb :
min max class
100 110 class1
110 120 class2
120 130 class3
130 140 class4
140 150 class5
结果我需要这样的表 df_new :
id volume class
1 139 class4
2 139 class4
3 133 class4
4 100 class1
5 NA NA
6 145 class5
答案 0 :(得分:1)
我们可以使用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
答案 1 :(得分:1)
如果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
答案 2 :(得分:0)
或使用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