首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据查找表创建新变量

根据查找表创建新变量
EN

Stack Overflow用户
提问于 2019-04-03 08:24:52
回答 2查看 77关注 0票数 2

我希望在数据框架上创建一个新变量,该变量使用查找表。所以我有了df1 (dataframe),它有数量和术语。我需要创建一个新的变量"Premium“,它使用查找表创建它的值。

我尝试了ifelse函数,但它太乏味了。下面是一个例子

代码语言:javascript
复制
df1 <- data.frame(Amount, Term)
df1
#   Amount Term
# 1   2500   23
# 2   3600   30
# 3   7000   45
# 4  12000   50
# 5  16000   38

我需要通过使用下面的Premium表来创建新的变量'Premium‘。

代码语言:javascript
复制
                  Term          
Amount           0-24 Mos  25-36 Mos 37-48 Mos 49-60 Mos
0 - 5,000         133      163       175       186
5,001 - 10,000    191      213       229       249
10,001 - 15,000   229      252       275       306
15,001 - 20,000   600      615       625       719
20,001 - 25,000   635      645       675       786

因此,溢价的产出应该是。

代码语言:javascript
复制
df1
#   Amount Term Premium
# 1   2500   23     133
# 2   3600   30     163
# 3   7000   45     229
# 4  12000   50     306
# 5  16000   38     625
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-03 09:04:11

为了得到你想要的东西,你需要组织表格并对数据进行分类。我提供了一个处理这种情况的潜在工作流程。希望这是有帮助的:

代码语言:javascript
复制
library(tidyverse)

df1 <- data.frame(
  Amount = c(2500L, 3600L, 7000L, 12000L, 16000L),
  Term = c(23L, 30L, 45L, 50L, 38L)
)

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
# functions for analysis ####
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#

amount_tier_function <- function(x){

  case_when(x <= 5000   ~ "Tier_5000",
            x <= 10000  ~ "Tier_10000",
            x <= 15000  ~ "Tier_15000",
            x <= 20000  ~ "Tier_20000",
            TRUE        ~ "Tier_25000")
}


month_tier_function <- function(x){

  case_when(x <= 24   ~ "Tier_24",
            x <= 36   ~ "Tier_36",
            x <= 48   ~ "Tier_48",
            TRUE      ~ "Tier_60")
}

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
# Recut lookup table headings ####
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#

lookup_df <- data.frame(stringsAsFactors=FALSE,
                amount_tier = c("Tier_5000", "Tier_10000", "Tier_15000", "Tier_20000",
                                "Tier_25000"),
                    Tier_24 = c(133L, 191L, 229L, 600L, 635L),
                    Tier_36 = c(163L, 213L, 252L, 615L, 645L),
                    Tier_48 = c(175L, 229L, 275L, 625L, 675L),
                    Tier_60 = c(186L, 249L, 306L, 719L, 786L)
             )

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
# Join everything together ####
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#

lookup_df_tidy <- lookup_df %>% 
  gather(mth_tier, Premium, - amount_tier)


df1 %>%
  mutate(amount_tier = amount_tier_function(Amount),
         mth_tier    = month_tier_function(Term)) %>%
  left_join(., lookup_df_tidy) %>%
  select(-amount_tier, -mth_tier)
票数 0
EN

Stack Overflow用户

发布于 2019-04-03 09:24:29

数据

代码语言:javascript
复制
df1 <- structure(list(Amount    = c(2500L, 3600L, 7000L, 12000L, 16000L), 
                      Term      = c(23L, 30L, 45L, 50L, 38L)), 
                 class     = "data.frame",
                 row.names = c(NA, -5L))

lkp  <- structure(c(133L, 191L, 229L, 600L, 635L, 
                    163L, 213L, 252L, 615L, 645L, 
                    175L, 229L, 275L, 625L, 675L, 
                    186L, 249L, 306L, 719L, 786L), 
                  .Dim      = 5:4, 
                  .Dimnames = list(Amount = c("0 - 5,000", "5,001 - 10,000",
                                              "10,001 - 15,000", "15,001 - 20,000", 
                                              "20,001 - 25,000"),
                                   Term   = c("0-24 Mos", "25-36 Mos", "37-48 Mos", 
                                              "49-60 Mos")))

  1. 首先使用列名和行名的正则表达式为月份和金额创建上限(您没有以可重复的方式发布数据,因此这个正则表达式可能需要根据实际的查找表结构进行调整): (月份<- c(0,as.numeric(“\d+-(\d+) Mos$","\1",冒号(Lkp)#1 024 36 48 60 (amt <- c(0,as.numeric)(sub(”^\d+,*d*- (\d+),(\d+)$",( "\1\2",行名(Lkp)#1 0 5 000 10000 15000 20000 25000
  2. 使用df1findInterval获取每个元素的位置: (行<- findInterval(df1$Amount,amt)) #1 1 1 2 3 4 (cols <- findInterval(df1 1$Term,月))#1 2 3 4 3
  3. 使用这些索引对查找矩阵进行子集: df1 1$ Premium <- lkpcbind(行,cols) df1#金额术语溢价#1 2500 23 133 #2 3600 30 163 #3 7000 229 #4 12000 50 306 #5 16000 38 625
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55490419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档