R:使用来自另一个数据帧的列名、条件和值在数据帧中创建一个新列

R:使用来自另一个数据帧的列名、条件和值在数据帧中创建一个新列,r,dplyr,plyr,tidyr,R,Dplyr,Plyr,Tidyr,将基本数据帧视为: data <- data.frame(amount_bin = c("10K-25K", "25K-35K", "35K-45K", "45K-50K", "50K+", "10K-25K", "25K-35K", "35K-45K", "45K-50K", "50K+", "10K-25K", "25K-35K", "35K-45K", "45K-50K", "50K+"), risk_score = c("0-700", "7

将基本数据帧视为:

data <-  data.frame(amount_bin = c("10K-25K", "25K-35K", "35K-45K", "45K-50K", "50K+", "10K-25K", "25K-35K", "35K-45K", "45K-50K", "50K+", "10K-25K", "25K-35K", "35K-45K", "45K-50K", "50K+"),
                   risk_score = c("0-700", "700-750", "750-800", "800-850", "850-900", "0-700", "700-750", "750-800", "800-850", "850-900", "0-700", "700-750", "750-800", "800-850", "850-900"))
group_info <- data.frame(variable = c("amount_bin_group", "amount_bin_group", "amount_bin_group", "amount_bin_group", "amount_bin_group",
                                 "risk_score_group", "risk_score_group", "risk_score_group", "risk_score_group", "risk_score_group"),
                    bin = c("10K-25K", "25K-35K", "35K-45K", "45K-50K", "50K+",
                            "0-700", "700-750", "750-800", "800-850", "850-900"),
                    group = c("1", "1", "2", "2", "3",
                              "a", "a", "a", "b", "b"))

data你的群组信息太过整洁了。我不敢相信我真的这么说。通过将其分解为两个数据帧,或者将每一半分解为它自己的列,您可以进行简单的左连接来获得答案

final_data_calc <- data %>%
  left_join(
    group_info %>% 
      filter(variable == 'amount_bin_group') %>% 
      rename(amount_bin_group = group,amount_bin = bin) %>% 
      select(-variable)
  ) %>%
  left_join(
    group_info %>% 
      filter(variable == 'risk_score_group') %>% 
      rename(risk_score_group = group,risk_score = bin) %>% 
      select(-variable)
  )

#   amount_bin risk_score amount_bin_group risk_score_group
#1     10K-25K      0-700                1                a
#2     25K-35K    700-750                1                a
#3     35K-45K    750-800                2                a
#4     45K-50K    800-850                2                b
#5        50K+    850-900                3                b
#6     10K-25K      0-700                1                a
#7     25K-35K    700-750                1                a
#8     35K-45K    750-800                2                a
#9     45K-50K    800-850                2                b
#10       50K+    850-900                3                b
#11    10K-25K      0-700                1                a
#12    25K-35K    700-750                1                a
#13    35K-45K    750-800                2                a
#14    45K-50K    800-850                2                b
#15       50K+    850-900                3                b
最终数据计算%
左联合(
组信息%>%
过滤器(变量=='amount\u bin\u group')%>%
重命名(金额\仓位\组=组,金额\仓位=仓位)%>%
选择(-变量)
) %>%
左联合(
组信息%>%
筛选(变量=='风险评分组')%>%
重命名(风险评分组=组,风险评分组=bin)%>%
选择(-变量)
)
#金额\银行风险\评分金额\银行\集团风险\评分\集团
#1 10K-25K 0-700 1 a
#2 25K-35K 700-750 1 a
#35K-45K 750-800 2 a
#4 45K-50K 800-850 2 b
#5 50K+850-900 3 b
#6 10K-25K 0-700 1 a
#7 25K-35K 700-750 1 a
#8 35K-45K 750-800 2 a
#9 45K-50K 800-850 2 b
#10 50K+850-900 3 b
#11 10K-25K 0-700 1 a
#12 25K-35K 700-750 1 a
#13 35K-45K 750-800 2 a
#14 45K-50K 800-850 2 b
#15 50K+850-900 3 b

您的群组信息非常整洁。我不敢相信我真的这么说。通过将其分解为两个数据帧,或者将每一半分解为它自己的列,您可以进行简单的左连接来获得答案

final_data_calc <- data %>%
  left_join(
    group_info %>% 
      filter(variable == 'amount_bin_group') %>% 
      rename(amount_bin_group = group,amount_bin = bin) %>% 
      select(-variable)
  ) %>%
  left_join(
    group_info %>% 
      filter(variable == 'risk_score_group') %>% 
      rename(risk_score_group = group,risk_score = bin) %>% 
      select(-variable)
  )

#   amount_bin risk_score amount_bin_group risk_score_group
#1     10K-25K      0-700                1                a
#2     25K-35K    700-750                1                a
#3     35K-45K    750-800                2                a
#4     45K-50K    800-850                2                b
#5        50K+    850-900                3                b
#6     10K-25K      0-700                1                a
#7     25K-35K    700-750                1                a
#8     35K-45K    750-800                2                a
#9     45K-50K    800-850                2                b
#10       50K+    850-900                3                b
#11    10K-25K      0-700                1                a
#12    25K-35K    700-750                1                a
#13    35K-45K    750-800                2                a
#14    45K-50K    800-850                2                b
#15       50K+    850-900                3                b
最终数据计算%
左联合(
组信息%>%
过滤器(变量=='amount\u bin\u group')%>%
重命名(金额\仓位\组=组,金额\仓位=仓位)%>%
选择(-变量)
) %>%
左联合(
组信息%>%
筛选(变量=='风险评分组')%>%
重命名(风险评分组=组,风险评分组=bin)%>%
选择(-变量)
)
#金额\银行风险\评分金额\银行\集团风险\评分\集团
#1 10K-25K 0-700 1 a
#2 25K-35K 700-750 1 a
#35K-45K 750-800 2 a
#4 45K-50K 800-850 2 b
#5 50K+850-900 3 b
#6 10K-25K 0-700 1 a
#7 25K-35K 700-750 1 a
#8 35K-45K 750-800 2 a
#9 45K-50K 800-850 2 b
#10 50K+850-900 3 b
#11 10K-25K 0-700 1 a
#12 25K-35K 700-750 1 a
#13 35K-45K 750-800 2 a
#14 45K-50K 800-850 2 b
#15 50K+850-900 3 b

您可以使用一个
for
循环来保持不同集合上的合并:

for (i in unique(group_info$variable)) {
  data <- merge(
    data, group_info[group_info$variable==i,c("bin","group")],
    by.x=sub("_group","",i), by.y="bin"
  )
  names(data)[names(data)=="group"] <- i
}
for(i为唯一(组信息$variable)){

数据您可以使用
for
循环在不同集合上保持合并:

for (i in unique(group_info$variable)) {
  data <- merge(
    data, group_info[group_info$variable==i,c("bin","group")],
    by.x=sub("_group","",i), by.y="bin"
  )
  names(data)[names(data)=="group"] <- i
}
for(i为唯一(组信息$variable)){

数据您提出的解决方案正是我要做的。您在一个表中存储的两个不同键上进行合并,因此对我来说,两个联接似乎是最简单的方式。可能有两个以上的变量,因此,寻找更有效的方法我们提出的解决方案正是我要做的。您在一个表中存储的两个不同键上进行合并,因此2个连接对我来说似乎是最简单的方法。可以有2个以上的变量,因此,寻找更有效的方法。提示:我的方法将所有内容强制为因子中的字符。仅供参考:我的方法将所有内容强制为因子中的字符。