【问题标题】:Creating a dummy with different arguments in R在 R 中创建具有不同参数的虚拟对象
【发布时间】:2018-04-12 22:59:32
【问题描述】:

我正在处理公司帐户数据的大数据集,以便在公司破产与否时解决分类问题。

数据集包含一个变量liquid,它表示清算开始的年份。鉴于公司实际上开始清算,这个变量在每年的观察中无处不在。否则为零。通常,liquid 大于观察的最后一年。因此,没有观察到公司开始清算当年的公司数据。有时,间隔甚至更长。例如,一家公司在 2005 年开始清算,但最后一次观察财务比率是在 2002 年。

数据样本可能如下所示:

现在,我想创建一个名为 bankruptcy 的新虚拟对象。如果这是开始清算的公司的最后一次观察(带有财务数据),则该值应为 1。您可以在上表中看到bankruptcy 的外观。我该如何进行?

【问题讨论】:

    标签: r classification svm dummy-variable


    【解决方案1】:

    可能有更好的方法,但是怎么样

    library(dplyr)

    df <-structure(list(year = structure(c(1L, 2L, 3L, 2L, 3L, 4L, 5L,  2L, 3L), .Label = c("2000", "2001", "2002", "2003", "2004"), class = "factor"), liquid = structure(c(2L, 2L, 2L, NA, NA, NA, NA, 1L, 1L), .Label = c("2003",  "2005"), class = "factor"), company = structure(c(1L, 1L, 
    1L, 2L, 2L, 2L, 2L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor"),  bankruptcy = c(0, 0, 0, 0, 0, 0, 0, 0, 0)), .Names = c("year", "liquid", "company", "bankruptcy"), row.names = c(NA, -9L), class = "data.frame")
    
    
    
    df %>%
       mutate(bankruptcy = 0)  %>%
       group_by(company) %>%
       mutate(bankruptcy = c(bankruptcy[-n()], 1)) %>%
       mutate(bankruptcy = ifelse(is.na(liquid),0,bankruptcy))
    

    【讨论】:

    • 不知何故,我得到的不是我想要的结果,但 seeellayewhy 的解决方案奏效了。还是谢谢你:)
    • 您能具体说明问题所在吗?输出看起来像你要求的那样
    【解决方案2】:

    如果我从您想要的输出中正确理解了您,您希望 bankruptcy 在每个 company 的最高值 liquid 中取 1。

    h/t 到 @user6617454 获取结构。

    df <-structure(list(year = structure(c(1L, 2L, 3L, 2L, 3L, 4L, 5L,  2L, 3L), .Label = c("2000", "2001", "2002", "2003", "2004"), class = "factor"), liquid = structure(c(2L, 2L, 2L, NA, NA, NA, NA, 1L, 1L), .Label = c("2003",  "2005"), class = "factor"), company = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor"),  ), .Names = c("year", "liquid", "company"), row.names = c(NA, -9L), class = "data.frame")
    
    df$year <- as.numeric(as.character(df$year))
    
    df$maxyear <- tapply(df$year, df$company, max)
    df$bankruptcy <- ifelse(!is.na(df$liquid) & df$year == df$maxyear, 
                            1, 
                            0)
    

    在该解决方案中,当公司有 liquid 值并且特定行是该公司的最大值时,bankruptcy 将采用 1。如果您的示例不能代表您的实际问题,这可能不起作用,但这确实会在您附加的图像中产生输出。

    【讨论】:

    • 感谢您的回复,基本成功了!我将它用于大型数据框,因此我没有使用 tapply,而是使用聚合函数,然后将数据框合并到我的整体数据框以创建破产变量。
    • 我从这种方法开始,但后来选择了 tapply,因为它更优雅一些。 @Patrick 如果是您使用的答案,您能接受我的回答吗?
    猜你喜欢
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 2019-11-21
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多