2016-06-23 8 views
4

Ich versuche, einen Bericht über die Datenvalidierung in R zu erstellen; Ich habe das Validierungspaket verwendet, um die allgemeine Zusammenfassung der Daten zu generieren, aber ich muss die Besonderheiten dessen ermitteln, was bei unseren Validierungsprüfungen fehlschlägt.R Validieren von Daten nur, wenn Spalte existiert

Was ich möchte, ist ein Datenrahmen von IDs, Spalten, die ihren Test nicht bestehen und den Wert, der den Test nicht besteht. Da jedoch nicht alle Spalten obligatorisch sind, muss ich überprüfen können, ob die Daten übergeben werden, ohne zu wissen, ob die Spalte vorhanden ist oder nicht.

Für andere Datenrahmen mit obligatorischen Daten habe ich es in True/False umgewandelt, ob es die Tests besteht. Zum Beispiel:

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 

Ich habe einen Datenrahmen mit den Kontrollen I, im Stil erstellen möchten:

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

Ich kann nicht nur diese laufen so sind, da wir nicht tun Lassen Sie Spalte D überprüfen, aber andere Datenrahmen, die diese Validierung durchlaufen, haben möglicherweise die Spalte D, aber nicht die Spalte B. Ich kann diesen Datenrahmen filtern, um nur die Tests für die Spalten, die wir haben, einzuschließen, aber gibt es dann eine Weise, die Tests in diesem Datenrahmen als Kontrollen anzuwenden? Gibt es einen besseren Weg, dies zu tun?

Vielen Dank für die Hilfe!

Antwort

-1

Ich würde die Prüfungen einzeln einrichten, so dass Sie die Existenz der Variablen vor der Auswertung überprüfen können. Würde die folgende Lösung funktionieren?

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) 
} 

Ich habe versucht, den Code weiter Refactoring von durch die Transmutation Kontrollen Looping war aber nicht in der Lage, herauszufinden, wie String Formeln richtig zu bewerten.

Jason