在R中使用查找表匹配时间间隔

维克

我正在寻找使用具有与标准(即“不良”,“平均”等)对齐的开始和结束间隔的查找参考表。

我有一个数据表,我想在其中创建一个新的Standard列,根据它在查找表上的间隔对数据值进行标记。下面是一个简化的示例。我的实际数据集要大得多,并且需要动态的,因此我不必在脚本中进行硬编码或创建许多单独的对象。

lookup_df = data.frame("Standard" = c("Poor", "Below_Average", "Average", "Above_Average", "Good"),
                  "Start" = c(2,3,4,5,6), "End" = c(3,4,5,6,7))

col = c(1.5, 5.2, 4.1, 3.3, 9.6, 2.4)

我试图使用ifelse()和findInterval()从查找Standard列返回索引。我知道问题出在索引部分,因为findInterval返回的0不能被索引。我试图通过将+1添加到findInterval来解决这个问题,但这也没有用。这是我一直在尝试的方法:

ifelse(findInterval(col, lookup_df$End)+1 > 1, lookup_df$Standard[findInterval(col, lookup_df$End)+1], "Poor")

# [1] "Poor"          "Above_Average" "Average"       "Below_Average"
# [5] NA              "Poor"   

我想要的结果是:

# [1] "Poor"          "Above_Average" "Average" "Below_Average"      
# [5] "Good"             "Poor"

我已经尝试过使用此示例中的transform()将间隔与R中另一个表中的值进行匹配,但也无法使其正常运行。

ifelse()索引问题似乎与通过索引从另一个向量返回的ifelse这个返回值对齐

我猜这里缺少一个简单的解决方案!任何帮助表示赞赏。

编辑包含最终答案

这是我基于R. Lima的解决方案并结合到dplyr中使用的最终解决方案:

lookup_vec = as.character(lookup_df$Standard)
names(lookup_vec) <- c("0", "1", "2", "3","4")

df = data.frame(col = c(1.5, 5.2, 4.1, 3.3, 9.6, 2.4))

df = df %>%
  mutate(Standard = stringr::str_replace_all(
    findInterval(col, lookup_df$Start[-1]), lookup_vec))
R.五

尽管我已经从包中使用了str_replace_all()stringr而不是ifelse(),但是应该可以做到这一点此函数处理您提到的零问题。

可能有一种更优雅,更快捷的方法来完成此操作,但这是成功的方法。

# Defining the lookup reference object
lookup <- c("Poor", "Below_Average", "Average", "Above_Average", "Good")
names(lookup) <- c("0", "1", "2", "3","4")

# Defining your data frame
df <- data.frame(col = c(1.5, 5.2, 4.1, 3.3, 9.6, 2.4))

# Classifying the data and inserting into your data frame
df$classes <- stringr::str_replace_all(
  findInterval(df$col, c(3,4,5,6)), lookup)
df$classes

[1] "Poor"          "Above_Average" "Average"       "Below_Average" "Good"         
[6] "Poor"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章