【问题标题】:Updating a dataframe / data.table in R within a for loop在 for 循环中更新 R 中的数据帧/data.table
【发布时间】:2017-10-23 04:54:16
【问题描述】:

我已经计算了相关系数和p系数,并将它们分别存储在两个矩阵cormat和pmat中。

我编写了代码来搜索高于阈值的相关性,然后将它们存储到数据帧中。

所以我创建了一个 data.table 来存储感兴趣的值:

Correlations <- data.table( i_n = numeric(), j_n = numeric(), correlation = numeric(), p = numeric(), predictorA = character(), 
                            predictorB = character())
> class(Correlations)
[1] "data.table" "data.frame"
> glimpse(Correlations)
Observations: 0
Variables: 6
$ i           <dbl> 
$ j           <dbl> 
$ correlation <dbl> 
$ p           <dbl> 
$ predictorA  <chr> 
$ predictorB  <chr> 

因此,我编写了代码来循环遍历 cormat 矩阵和 pmat 矩阵:

threshold <- 0  # Just to test the code
for (i in (1 : (ncol(cormat) - 1))){
      for(j in ( (i+1) : ncol(cormat))){
        if (cormat[i, j] > threshold & !is.na(pmat[i , j]) & pmat[i , j] < 0.05){
     Correlations[, ':='(i_n = i, j_n = j, correlation = cormat[i , j], p = pmat[i , j], predictorA =colnames(cormat)[i], 
                          predictorB = colnames(cormat)[j] ) ]
 }

此代码不会产生错误消息,但什么也不做:

   > dim(Correlations)
[1] 0 6 

事实上,以下代码都没有像预期的那样更新 data.table Correlations:

> Correlations[, ':='(i_n = 1, j_n = 2, correlation = 1, p = 2, predictorA ="A", 
+                     predictorB = "B" ) ]
> dim(Correlations)
[1] 0 6

接下来我尝试了 dplyr。

for (i in (1 : (ncol(cormat) - 1))){
    for(j in ( (i+1) : ncol(cormat))){
      if (cormat[i, j] > threshold & !is.na(pmat[i , j]) & pmat[i , j] < 0.05){
        Correlations <- Correlations %>% mutate(i = i, j = j, correlation = cormat[i , j], p = pmat[i , j], predictorA =colnames(cormat)[i], 
                                               predictorB = colnames(cormat)[j])
       }
   }
 }

这也不起作用:

  > dim(Correlations)
    [1] 0 6

最后我尝试了以下代码:

k <- 1
for (i in (1 : (ncol(cormat) - 1))){
     for(j in ( (i+1) : ncol(cormat))){
        if (cormat[i, j] > threshold & !is.na(pmat[i , j]) & pmat[i , j] < 0.05){
      Correlations$i_n[k] <- i
      Correlations$j_n[k] <- j
      Correlations$correlation[k] <- cormat[i , j]
      Correlations$p[k] <- pmat[i , j]
      Correlations$predictorA[k] <- colnames(cormat)[i]
      Correlations$predictorB[k] <- colnames(cormat)[j] 

      k <- k + 1
      }
  }

此代码再次运行,没有错误消息,但再次没有更新表 Correlation。

 > dim(Correlations)
    [1] 0 6

你能帮我理解我做错了什么吗?为什么我的代码没有更新目标表相关性?在上述每种情况下应如何修改以完成要求的内容?

#

cormat 和 pmat 示例:

#

科马特

                         CustSegmentVBM EmploymentPositionTypeID SafeDepositsLockers StandingOrders CompaniesPayrolls CrossSell Avg_Deposits
CustSegmentVBM                   1.0000                   -0.094             -0.0260         0.0140          -0.02300    -0.014       -0.022
EmploymentPositionTypeID        -0.0940                    1.000              0.0470         0.0950           0.17000     0.200        0.140
SafeDepositsLockers             -0.0260                    0.047              1.0000         0.0660           0.00710     0.150        0.062
StandingOrders                   0.0140                    0.095              0.0660         1.0000           0.02700     0.530        0.075
CompaniesPayrolls               -0.0230                    0.170              0.0071         0.0270           1.00000     0.066        0.024
CrossSell                       -0.0140                    0.200              0.1500         0.5300           0.06600     1.000        0.160
Avg_Deposits                    -0.0220                    0.140              0.0620         0.0750           0.02400     0.160        1.000
Avg_Investments                 -0.0038                    0.012              0.0078         0.0054          -0.00006     0.014        0.015
eBranchUser                     -0.0023                    0.003              0.0012         0.0055          -0.00038     0.013        0.020
RFM Score                        0.0790                    0.077              0.0680         0.3000          -0.00290     0.700        0.130
                         Avg_Investments eBranchUser RFM Score
CustSegmentVBM                  -0.00380    -0.00230    0.0790
EmploymentPositionTypeID         0.01200     0.00300    0.0770
SafeDepositsLockers              0.00780     0.00120    0.0680
StandingOrders                   0.00540     0.00550    0.3000
CompaniesPayrolls               -0.00006    -0.00038   -0.0029
CrossSell                        0.01400     0.01300    0.7000
Avg_Deposits                     0.01500     0.02000    0.1300
Avg_Investments                  1.00000     0.00120    0.0054
eBranchUser                      0.00120     1.00000    0.0120
RFM Score                        0.00540     0.01200    1.0000

pmat

                        CustSegmentVBM EmploymentPositionTypeID SafeDepositsLockers StandingOrders CompaniesPayrolls CrossSell Avg_Deposits
CustSegmentVBM                       NA                  0.0e+00             0.0e+00        0.0e+00           0.0e+00         0            0
EmploymentPositionTypeID         0.0000                       NA             0.0e+00        0.0e+00           0.0e+00         0            0
SafeDepositsLockers              0.0000                  0.0e+00                  NA        0.0e+00           5.6e-07         0            0
StandingOrders                   0.0000                  0.0e+00             0.0e+00             NA           0.0e+00         0            0
CompaniesPayrolls                0.0000                  0.0e+00             5.6e-07        0.0e+00                NA         0            0
CrossSell                        0.0000                  0.0e+00             0.0e+00        0.0e+00           0.0e+00        NA            0
Avg_Deposits                     0.0000                  0.0e+00             0.0e+00        0.0e+00           0.0e+00         0           NA
Avg_Investments                  0.0075                  2.2e-16             3.1e-08        1.4e-04           9.7e-01         0            0
eBranchUser                      0.1000                  3.5e-02             3.8e-01        9.2e-05           7.9e-01         0            0
RFM Score                        0.0000                  0.0e+00             0.0e+00        0.0e+00           3.8e-02         0            0
                         Avg_Investments eBranchUser RFM Score
CustSegmentVBM                   7.5e-03     1.0e-01   0.00000
EmploymentPositionTypeID         2.2e-16     3.5e-02   0.00000
SafeDepositsLockers              3.1e-08     3.8e-01   0.00000
StandingOrders                   1.4e-04     9.2e-05   0.00000
CompaniesPayrolls                9.7e-01     7.9e-01   0.03800
CrossSell                        0.0e+00     0.0e+00   0.00000
Avg_Deposits                     0.0e+00     0.0e+00   0.00000
Avg_Investments                       NA     4.0e-01   0.00014
eBranchUser                      4.0e-01          NA   0.00000
RFM Score                        1.4e-04     0.0e+00        NA

【问题讨论】:

  • 重现问题的数据在哪里? cormatpmat
  • 这些是非常大的矩阵。我发布了一个仅保留前 10 个变量的示例。不知道有没有办法附加文件。

标签: r for-loop data.table dplyr variable-assignment


【解决方案1】:

就 data.table 而言,以下代码有效:

for (i in (1 : (ncol(cormat) - 1))){

  for(j in ( (i+1) : ncol(cormat))){

    if (abs(cormat[i, j]) > threshold & !is.na(pmat[i , j]) & pmat[i , j] < 0.05){


      Correlations <- rbind(Correlations, data.table(i_n = i, j_n = j, correlation = cormat[i , j], p = pmat[i , j], predictorA =colnames(cormat)[i], 
                          predictorB = colnames(cormat)[j] ) )


  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 2015-04-05
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多