我正在处理大量公司帐户数据,以便在公司破产时解决分类问题。
数据集包含一个变量liquid
,表示清算开始的年份。考虑到公司实际开始清算,这个变量在每年的观察中都是无所不在的。否则它为零。通常,liquid
大于观察的最后一年。因此,在公司开始清算的那一年,没有对公司数据的观察。有时候,还有更长的差距。例如,一家公司在2005年开始清算,但最后一次对财务比率的观察是在2002年。
数据样本可能如下所示:
现在,我想创建一个名为bankruptcy
的新假人。如果是开始清算的公司的最后一次观察(有财务数据),则应该取值1。您可以在上表中看到bankruptcy
的外观。我该怎么办?
答案 0 :(得分:0)
可能有更好的方法,但
怎么样 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))
答案 1 :(得分:0)
如果我从您想要的输出中正确理解了您,那么您希望bankruptcy
为每个liquid
取最高company
的值。
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)
在该解决方案中,bankruptcy
会在公司有1
值时显示liquid
,特定行是该公司的最大值。如果您的例子不能代表您的实际问题,这可能无效,但这确实会在附加图像中产生输出。