我试图通过基于数据集中的两个变量迭代另一个数据框来在数据集(+/- 10K行)中创建新变量。不知怎的,我不知道如果不使用合并(刚刚开始学习R),也许有人可以指导我朝正确的方向发展。
数据集中的快照 - dat
ContractNumber | PDRating | PD_month
---
1 | 7+ | 1
---
1 | 7+ | 2
---
1 | 7+ | 3
---
2 | 6+ | 1
---
2 | 6+ | 2
---
and so on.....
因此,每份合约都有一份PDRating(代表违约概率)和一份代表合约月份的PDMonth。因此,如果合约的长度为60个月,则合约有60份记录。 (顺便说一下这是关于StackOverflow的第一个问题,我还没想出如何格式化漂亮的表格)
我要迭代的数据框(PD_Table)由180行组成,代表几个月,在de header中,PDRatings为列名。看起来像这样:
PD_month | 5- | 6+ | 6 | 6- | 7+ | ...
---
1 | 0.0001 | 0.0002 | 0.0004 | 0.0005 | ...
---
2 | 0.0001 | 0.0002 | 0.0004 | 0.0005 | ...
---
3 | 0.0001 | 0.0002 | 0.0004 | 0.0005 | ...
---
4 | 0.0001 | 0.0002 | 0.0004 | 0.0005 | ...
---
5 | 0.0001 | 0.0002 | 0.0004 | 0.0005 | ...
---
and so on.....
我想要创建的新变量是dat $ PD,新的“dat”应如下所示:
ContractNumber | PDRating | PD_month | PD
---
1 | 7+ | 1 | 0.0005
---
1 | 7+ | 2 | 0.0005
---
1 | 7+ | 3 | 0.0005
---
2 | 6+ | 1 | 0.0002
---
2 | 6+ | 2 | 0.0002
---
and so on.....
现在我已经完成了:
# convert PD_Table to wide format
melt(PD_Table, id.vars = "PD_month")
%>% rename(c("variable" = "PDRating", "value" = "PD"))
# Merge datasets and sort
arrange(merge(dat, PD_Table, by = c("PDRating", "PD_month"),
all.x = TRUE, sort = FALSE), ContractNumber)
这很有效,但感觉有点笨拙,我必须对行进行排序并重新排序列。所以基本上我正在寻找更智能的解决方案
在我尝试过的不起作用的事情中,有以下几点:
dat$PD <- PD_Table[dat$PD_month, dat$PDRating]
# Returns a vector with all values for a rating as PD value]
# Note PD_Table was still in wide format
dat$PD <- for (i in nrow(dat)) PD_Table[dat$PD_month[i], dat$PDRating[i]]
# Does not returns anything
dat$PD <- for (i in nrow(dat3)) PD_Table[dat$PD_month[i], which(dat3$PDRating[i] == colnames(PD_Table))]
# Does not returns anything
非常感谢任何帮助!
亲切的问候, 马蒂斯
答案 0 :(得分:0)
这对你有用吗?
我已经加载了类似于你从csv中显示的两个表的数据。
library(data.table)
PDR <- as.data.table(read.csv("PDRatings.csv"));
PDT <- as.data.table(read.csv("PDTable.csv"));
将PD_table(此处为PDT)融合为长格式。
PDTm <- melt.data.table(PDT, id.vars=c("PD_month"),
variable.name = "PDRating",
value.name = "PD")
一些可怕的清理命名法。
PDTm[, PDRating := sub("X", "", PDRating)] # X6 becomes 6
PDTm[, PDRating := sub("5.", "5+", PDRating)] # 5. becomes 5+
PDTm[, PDRating := sub("6.$", "6-", PDRating)] # 6. becomes 6-
PDTm[, PDRating := sub("7.$", "7-", PDRating)] # 7. becomes 7-
PDTm[, PDRating := sub("6..1", "6+", PDRating)] # 6..1 becomes 6+
PDTm
最后,合并数据表。
setkey(PDR, PDRating, PD_month)
setkey(PDTm, PDRating, PD_month)
merge(PDR, PDTm, all.x=TRUE)
你怎么看?我按预期输出了数据,即:
PDRating PD_month ContractNumber PD
1: 6+ 1 2 5e-04
2: 6+ 2 2 5e-04
3: 7+ 1 1 NA
4: 7+ 2 1 NA
5: 7+ 3 1 NA