通过迭代R

时间:2016-09-15 12:22:44

标签: r

我试图通过基于数据集中的两个变量迭代另一个数据框来在数据集(+/- 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

非常感谢任何帮助!

亲切的问候, 马蒂斯

1 个答案:

答案 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