2016-06-23 12 views
4

Rのデータ検証に関するレポートを作成しようとしています。私は、データの一般的な要約を生成するためにvalidateパッケージを使用しましたが、私たちの検証チェックに失敗したことの詳細を取得する必要があります。R列が存在する場合のみデータを検証する

私が最後にしたいのは、IDのデータフレーム、テストに失敗したカラム、テストに失敗した値です。ただし、すべての列が必須ではないので、列がそこにあるかどうかを知らずにデータが通過するかどうかを確認する必要があります。

必須のデータを持つ他のデータフレームについては、テストに合格したかどうかをTrue/Falseに変換しました。我々はしないので、あると私はこれらを実行することはできません

second_data_check = data.frame(a = 'a>21', 
          b = 'b > 31', 
          c = 'c> 51', 
          d = 'd> 61') 

:たとえば:

library(dplyr) 
library(validate) 
library(tidyr) 

test_df = data.frame(id = 1:10, 
       a = 11:20, 
       b = c(21:25,36,27:30), 
       c = c(41,52,43:50)) 

text_check = test_df %>% transmute(
     a = a>21, 
     b = b > 31, 
     c = c> 51 
) 

value_fails<-data.frame(id = test_df$id, text_check[,-1][colSums(text_check[,-1]) > 0]) 

value_failures_gath = gather(value_fails, column, changed, -id) %>% filter(changed == TRUE) 
value_failures_gath$Value = apply(value_failures_gath, c(1), function(x) 
       test_df[test_df$id == x[['id']], grep(x[['column']], colnames(test_df))]) 
value_failures_gath<-value_failures_gath %>% arrange(id, column) 
value_failures_gath$changed<-NULL 

colnames(value_failures_gath)<-c('ID','Field','Value') 

> value_failures_gath 
    ID Field Value 
1 2  c 52 
2 6  b 36 

私はのスタイルで、私が作成したいのチェックとデータフレームを持っていますチェックする列Dがあるが、この検証によって実行される他のデータフレームは列Dを有するが、例えば列Bを有さないことがある。このデータフレームをフィルタリングして、私たちが持っているカラムのテストだけを含めることができますが、このデータフレームのテストをチェックとして適用する方法はありますか?これを行うより良い方法はありますか?

ありがとうございました。

答えて

-1

評価の前に変数の存在を確認できるように、一度に1つずつチェックを設定します。次の解決策は機能しますか?

text_check = data.frame(id=test_df$id) 

if('a' %in% colnames(test_df)){ 
    text_check_temp = test_df %>% transmute(a=a>21) 
    text_check <- cbind(text_check, text_check_temp) 
} 
if('b' %in% colnames(test_df)){ 
    text_check_temp = test_df %>% transmute(b=b>31) 
    text_check <- cbind(text_check, text_check_temp) 
} 
if('c' %in% colnames(test_df)){ 
    text_check_temp = test_df %>% transmute(c=c>51) 
    text_check <- cbind(text_check, text_check_temp) 
} 
if('d' %in% colnames(test_df)){ 
    text_check_temp = test_df %>% transmute(d=d>61) 
    text_check <- cbind(text_check, text_check_temp) 
} 

私はさらに核変換チェックをループでコードをリファクタリングしようとしているが、適切に、文字列式を評価する方法を見つけ出すことができなかったました。

Jason

関連する問題