2017-06-28 3 views
0

列に欠損値を特定するループを作成するのが難しいです。このループを使用して、小さなデータセットに列を追加し、マウスで代入してから後でマージします。出力データはエリアコードに基づいてより小さいサブセットになり、各エリアコードは異なる列で異なる欠損値を持つため、私の関数内で手作業で書くことはできません。参考のためルーピングの列と行R

library(mice) 
    ListingPricePrep<-function(Zip,dataset){ 
    City<-subset.data.frame(dataset,dataset$ZipCode==Zip) 

    #Fault Area# 

    t1<-mice(City[,c(7,12:13,15:16,21:22,24:25,27:28,30:31)],m=1,method = "norm") 
    t2<-mice(City[,9:10]) 

    df1<-mice::complete(t1) 
    df2<-mice::complete(t2) 

    City<-cbind.data.frame(City[,c(1:3,5,6,8,11,14,20,23,26,29)],df1,df2) 
    City$LPB<-ifelse(City$`Median Listing Price`>mean(City$`Median Listing Price`)+sd(City$`Median Listing Price`),1,0) 
    City$LPMMB<-ifelse(City$`Median Listing Price M/M`>0,1,0) 
    City$LPYYB<-ifelse(City$`Median Listing Price Y/Y`>0,1,0) 
    City$ALCMMB<-ifelse(City$`Active Listing Count M/M`>0,1,0) 
    City$ALCYYB<-ifelse(City$`Active Listing Count Y/Y`>0,1,0) 
    City$DOMMMB<-ifelse(City$`Days on Market M/M`>0,1,0) 
    City$DOMYYB<-ifelse(City$`Days on Market Y/Y`>0,1,0) 
    City$NLCMMB<-ifelse(City$`New Listing Count M/M`>0,1,0) 
    City$NLCYYB<-ifelse(City$`New Listing Count Y/Y`>0,1,0) 
    City$ALPMMB<-ifelse(City$`Avg Listing Price M/M`>0,1,0) 
    City$APLYYB<-ifelse(City$`Avg Listing Price Y/Y`>0,1,0) 
    City$TLCMMB<-ifelse(City$`Total Listing Count M/M`>0,1,0) 
    City$TLCYYB<-ifelse(City$`Total Listing Count Y/Y`>0,1,0) 
    City$MonthName<-month(City$Month) 

    fits <- list(normal = fitdistr(City$`Median Listing Price`, "normal"), 
     weibull = fitdistr(City$`Median Listing Price`, "weibull"), 
     lognormal= fitdistr(City$`Median Listing Price`,"lognormal"), 
     logistic= fitdistr(City$`Median Listing Price`,"logistic"), 
     cauchy= fitdistr(City$`Median Listing Price`,"cauchy"), 
     poisson= fitdistr(City$`Median Listing Price`,"poisson"), 
     t= fitdistr(City$`Median Listing Price`,"t") 
     ) 

    print(sort(sapply(fits,function(i) i$loglik),decreasing = T)) 
    return(City) 

}

彼らは上記の指定された列の欠損値を持っているように、一部の出力は動作しますが、その他は戻ります:マウスにおける エラー(市[、C(7 、12:13,15:16,21:22,24:25,27:28,30:31)]: 欠けている値が見つかりませんでした

これは私にとって楽しいプロジェクトです。適切な都市を選んで選ぶことで仕事をしますが、私はfunctの作成を練習したいイオン機能...

はこれまでのところ、私はかなりオフベースループで以下のようだ:

for (i in 1:length(dataset)) for (j in ncol(dataset)){ 
     dat<-names(dataset[is.na(dataset[i,j])==T]) 
    } 

P.S.コードのクリーンアップや最適化の提案についてコメントしてください。誰もが違うスタイルを持っています。

編集私は時々行方不明と時々ない、月と地域コードに依存している中央のリスト価格Y/Yのようなものを転嫁したい

Sample Data Picture

+3

小さなサンプルデータセットと望ましい結果を追加してください。 https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

+1

再現可能なサンプルデータセットを提供してください。 – www

答えて

1

あなたのdatは変更されません。だからこそこれがうまくいっても、最後の価値しか残さないでしょう。 はこの library(data.table) dt <- as.data.table(dataset) dt[,lapply(.SD,function(x){sum(is.na(x))>0})] # this will give you which columns have NA dt[,is.na(dt),with=F]

+0

@ycwそれを編集しました。ありがとう:) – quant

+0

私は得ています > dt [、is.na(dt)、= F] '[.data.table'(dt、、is.na(dt)、= Fのエラー) : jの項目1は列番号範囲[1、ncol = 34]の外にある185です。 – ASavage

1
dt <- as.data.table(dataset) 
d1<-data.frame(dt[,lapply(.SD,function(x){sum(is.na(x))>0})]) # this will give you which columns have NA 
d2<-(which(d1[1,]==TRUE)) 
d3<-dataset[,d2] 

を試してみて、あなたがキックスタートのアイデアのために@quantありがとうございました。私は、== Falseで2番目のサブセットを作成し、結果をまとめてマージします。