【问题标题】:In R Matching variables in one data set to another data set for if else binned variables在 R 中,将一个数据集中的变量与另一个数据集中的 if else 分箱变量匹配
【发布时间】:2015-05-22 17:09:39
【问题描述】:

我正在尝试根据另一个数据帧的一些预定义分箱对一些 (75) 连续变量进行分箱。例如,数据框 G 包含我想要的所有 bin,数据框 Test 是我需要谨慎的连续变量所在的位置。例如,变量 X3975 的 bin 截止点为 .0625 和 .1,因此我需要编写如下 ifelse 语句:

Ifelse((X3975 >=0 & X3975 <=.0625),”0-.0625”,
Ifelse((X3975 >=.0625 & X3975 <=.1),”.0625-.1”,
Ifelse((X3975 >= .1 ),”>.1”,

对于 G 数据集中的每个变量要与 Test 数据集中的变量匹配。有没有一种有效的方法来做到这一点?

G dataframe 数据集长这样:

Bins   Variable 
  1. .0625 X3975
  2. .1 X3975
  3. .01 X3976
  4. .1 X3976 …… 共有 75 个不同的变量,具有不同的 bin 数量

测试数据框数据集

X3001 X3100 X3102 .... X3999

【问题讨论】:

    标签: r loops variables if-statement matching


    【解决方案1】:

    你可以试试cut

    lst <- split(G$Bins, G$Variable)
    df2 <- df1
    df2[] <- Map(function(x,y) cut(x, breaks=c(-Inf,y,Inf)), df1, lst[names(df1)])
    
    df2 
    

    数据

    df1 <- structure(list(X3001 = c(14, 14, NA, 10, 3, 5), X3100 = c(23, 
    7, NA, 24, 7, 6), X3102 = c(1, 1, NA, 3, 0, 1), X3104 = c(0, 
    0, NA, 2, 0, 0), X3109 = c(1, 1, NA, 7, 1, 1), X3111 = c(197, 
    71, NA, 90, 177, 88), X3113 = c(37, 48, NA, 86, NA, 52), X3116 = c(197, 
    71, NA, 76, 177, 88), X117 = c(197, NA, NA, NA, NA, NA)),
    .Names = c("X3001", 
    "X3100", "X3102", "X3104", "X3109", "X3111", "X3113", "X3116", 
    "X117"), row.names = c(NA, -6L), class = "data.frame")
    
    G <- structure(list(Bins = c(0, 7, 12, 0, 12, 22, 0, 1, 3, 0, 2, 0, 
    6, 40, 150, 200, 10, 40, 90, 60, 180, 80, 180), Variable = c("X3001", 
    "X3001", "X3001", "X3100", "X3100", "X3100", "X3102", "X3102", 
    "X3102", "X3104", "X3104", "X3109", "X3109", "X3111", "X3111", 
    "X3111", "X3113", "X3113", "X3113", "X3116", "X3116", "X117", 
    "X117")), .Names = c("Bins", "Variable"), row.names = c(NA, -23L
     ), class = "data.frame")
    

    【讨论】:

    • 这太棒了,肯定让我很接近!!!但是,我在 G 数据集中的最低值是零,最高是 880000。有没有办法代替从零到 880000 的 -Inf 到 Inf 的中断?我真的很感激这个帮助!!!你为我节省了大量时间!!
    • @JoseMelendez 您可以将-Inf, Inf 更改为0, 880000 或可能是0-0.0001 and 880000+0.1(虽然未测试)
    • 0 到 880000 的削减不起作用,它给出了一个错误,说中断不是唯一的,但另一种方式成功了!!!我真的很感激!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2020-06-04
    • 2017-01-10
    • 1970-01-01
    相关资源
    最近更新 更多