【问题标题】:Look up table based on integer values基于整数值查找表
【发布时间】:2020-02-03 16:06:23
【问题描述】:

考虑以下数据框:

lookup <- 
data.frame(
level = 1:5,
points_needed = c(150, 250, 420, 580, 620)
)

lookup

  level points_needed
1     1           150
2     2           250
3     3           420
4     4           580
5     5           620

现在考虑以下观察结果:

data <-
data.frame(
person_name = c("Bob", "Bob", "Bob", "Jim", "Jim"),
match = c(1, 2, 3, 1, 2),
total_points = c(100, 300, 430, 200, 600)
)

data
  person_name match total_points
1         Bob     1          100
2         Bob     2          300
3         Bob     3          430
4         Jim     1          200
5         Jim     2          600

我想在数据中创建新列。此列将指示 person_name 的级别 - 此更改基于与 lookup 表相关的 total_points。期望的结果:

data
  person_name match total_points level
1         Bob     1          100     0
2         Bob     2          300     2
3         Bob     3          430     3
4         Jim     1          200     1
5         Jim     2          600     5

我不能在这里使用联接,因为没有什么可加入的。有什么建议吗?

【问题讨论】:

    标签: r dplyr lookup


    【解决方案1】:

    这里使用findInterval,不需要使用实际级别,因为它是有序且连续的

    data$level <- findInterval(data$total_points, lookup$points_needed)
    
    > data
      person_name match total_points level
    1         Bob     1          100     0
    2         Bob     2          300     2
    3         Bob     3          430     3
    4         Jim     1          200     1
    5         Jim     2          600     4
    

    注意最后一行的级别似乎是 4

    为查找表添加文本标签

    lookup <- 
      data.frame(
        level = 1:5,
        points_needed = c(150, 250, 420, 580, 620),
        label = c("blue", "green", "yellow", "orange", "red")
      )
    
    data$level <- findInterval(data$total_points, lookup$points_needed)
    data$level2[data$level > 0] <- as.character(lookup$label[data$level])
    
    > data
      person_name match total_points level level2
    1         Bob     1          100     0   <NA>
    2         Bob     2          300     2  green
    3         Bob     3          430     3 yellow
    4         Jim     1          200     1   blue
    5         Jim     2          600     4 orange
    

    如果标签不保存为因子,则不需要使用as.character

    【讨论】:

    • 让我们假设 level 是一个字符串值c("blue", "green", "yellow", "orange")。解决方案如何变化?
    • @PhillipBlack 添加了字符串标签。可以覆盖原始列,但创建了第二列以便更容易确认结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多