1

データ フレーム内の外れ値を識別し、それらを削除またはキャップするコードがいくつかあります。apply() 関数 (またはおそらく別の方法) を使用して、削除プロセスを高速化しようとしています。

サンプルデータ

https://github.com/crossfitAL/so_ex_data/blob/master/subset
# this is the contents of a csv file, you will need to load it into your R session.

# set up an example decision-matrix
# rm.mat is a {length(cols) x 4} matrix -- in this example 8 x 4
# rm.mat[,1:2] - identify the values for min/max outliers, respectively.
# rm.mat[,3:4] - identify if you wish to remove min/max outliers, respectively.
cols <- c(1, 6:12) # specify the columns you wish to examine
rm.mat <- matrix(nrow = length(cols), ncol= 4, 
                dimnames= list(names(fico2[cols]), 
                c("out.min", "out.max","rm outliers?", "rm outliers?")))

# add example decision criteria
rm.mat[, 1] <- apply(fico2[, cols], 2, quantile, probs= .05)
rm.mat[, 2] <- apply(fico2[, cols], 2, quantile, probs= .95)
rm.mat[, 3] <- replicate(4, c(0,1))
rm.mat[, 4] <- replicate(4, c(1,0))

サブセット化のための私の現在のコードは次のとおりです。

df2 <- fico2 # create a copy of the data frame
cnt <- 1     # add a count variable
for (i in cols) { 
# for each column of interest in the data frame. Determine if there are min/max 
# outliers  that you wish to remove, remove them.        
  if (rm.mat[cnt, 3] == 1 & rm.mat[cnt, 4] == 1) {
    # subset / remove min and max outliers
    df2 <- df2[df2[, i] >= rm.mat[cnt, 1] & df2[, i] <= rm.mat[cnt, 2], ]  
  } else if (rm.mat[cnt, 3] == 1 & rm.mat[cnt, 4] == 0) {
    # subset / remove min outliers
    df2 <- df2[df2[, i] >= rm.mat[cnt, 1], ]
  } else if (rm.mat[cnt, 3] == 0 & rm.mat[cnt, 4] == 1) {
    # subset / remove max outliers
    df2 <- df2[df2[, i] <= rm.mat[cnt, 2], ]
  }
  cnt <- cnt + 1
}

提案された解決策:コードを高速化するforループ/ベクトル化を削除して、適用タイプの関数を介してこれを行うことができるはずだと思います。私が直面している問題は、決定マトリックスが私がそうすべきであることを示している場合にのみ、関数を適用しようとしていることです。IE-論理ベクトルrm.mat[,3] or rm.mat[,4]を使用して、サブセット化"["をデータフレームに適用する必要があるかどうかを判断しdf2ます。

どんな助けでも大歓迎です!また、サンプルデータ/コードが十分かどうか教えてください。

4

1 に答える 1

0

ここに解決策があります。コードを明確にするためだけに。他の人がそれを使ってより良い解決策を与えることができることを願っています。

したがって、理解すれば、次のような決定マトリックスがあります。

rm.mat
                                      c1 c2 c3 c4
amount.funded.by.investors     27925.000 NA  0  1
monthly.income                 11666.670 NA  1  0
open.credit.lines                 18.000 NA  0  1
revolving.credit.balance       40788.750 NA  1  0
inquiries.in.the.last.6.months     3.000 NA  0  1
debt.to.inc                       28.299 NA  1  0
int.rate                          20.490 NA  0  1
fico.num                         775.000 NA  1  0

そして、この行列の値に従って大きな行列をフィルタリングしようとします

colnames(rm.mat) <- paste('c',1:4,sep='')    
rm.mat <- as.data.frame(rm.mat)
apply(rm.mat,1,function(y){
     h <- paste(y['c3'],y['c4'],sep='')
     switch(h,
            '11'= apply(df2,2, function(x)
                               df2[x >= y['c1'] &  x <= y['c2'],]),  ## we never have this!!
            '10'= apply(df2,2, function(x)
                               df2[x >= y['c1'] , ]),   ## here we apply by columns!
            '01'= apply(df2,2,function(x) 
                               df2[x <= y['c2'], ]))   ## c2 is NA!! so !!!
 }
)
于 2013-02-19T21:08:34.077 に答える