将一列与循环表的两列范围匹配

时间:2018-06-26 16:26:10

标签: r dataframe

我希望这个问题尚未得到解答,我希望搜索正确的术语(因为我不确定如何用几句话来表达我的问题)。

所以基本上我有一个带有一列所谓的SIC代码的数据框。我还有一个查找表,可将每个SIC代码分类为特定类别。现在,我想将SIC代码与类别编号匹配。但是,查询表仅提供了SIC代码的范围,即行包含:

  1. 分类号
  2. 此分类的最低SIC代码
  3. 此分类的最高SIC代码。

如果我有一个像1111这样的SIC代码,但是循环表的第2列是1000,第3列是1500,那么简单的匹配功能将无法工作。我创建了一个示例以更好地理解:

test <- as.data.frame(c(1012, 2010, 3545, 5550, 7068))
colnames(test) <- "SIC"
ind_num <- c(1, 3, 4, 5, 7, 10, 11, 12, 14, 15)
sic_low <-  c(0, 1010, 1012, 1050, 2000, 2005, 3500, 5550, 7050, 8000)
sic_high <- c(20, 1011, 1020, 1099, 2002, 2020, 3545, 5551, 7070, 8010)
LUPtable <- data.frame(ind_num, sic_low, sic_high)

test$new <- lapply(test$SIC, function(x) LUPtable$ind_num[match(x, LUPtable$sic_low)])

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以遍历每个值以使用vapply()进行测试,并获取介于其之间的低值和高值的索引。

LUPtable$ind_num[vapply(test$SIC, function(x) which(x >= LUPtable$sic_low & x <= LUPtable$sic_high), numeric(1))]

答案 1 :(得分:0)

或类似

test$new <- lapply(test$SIC, function(x) LUPtable$ind_num[x>=LUPtable$sic_low & x<=LUPtable$sic_high])