【问题标题】:Matching Intervals with Using Lookup Table in R在 R 中使用查找表匹配区间
【发布时间】:2021-01-09 16:35:15
【问题描述】:

我正在寻找一个查找参考表,该表的开始和结束间隔与标准一致(即“差”、“平均”等)

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

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() 从查找标准列返回索引。我知道问题是索引部分,因为 findInterval 返回无法索引的 0。我试图通过向 findInterval 添加 +1 来解决这个问题,但这也没有用。这是我一直在尝试的:

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() Matching intervals with values in another table in R,但也无法使其正常运行。

ifelse() 索引问题似乎与这个return value of ifelse from another vector via index 一致

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

编辑以包含最终答案

这是我使用的最终解决方案,基于 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 if-statement indexing lookup intervals


    【解决方案1】:

    应该这样做,尽管我使用包stringr 中的str_replace_all() 而不是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"
    
    

    【讨论】:

    • 成功了!我为我的数据调整了它并包含了上面的解决方案。谢谢!
    猜你喜欢
    • 2020-02-13
    • 2020-02-05
    • 2019-09-30
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 2018-03-04
    相关资源
    最近更新 更多