2017-06-19 3 views
0

Ich versuche, eine Gesamtzahl von einem bestimmten Wert in einer großen Datenmenge zu finden. Insbesondere möchte ich eine neue Variable namens "Diabetes" erstellen, die mit 0/1 für Nein/Ja codiert ist. Hier ein Beispiel:Funktion nicht auf größere Datenmenge arbeiten

Test <- data.frame(
      s_1_1 = c(1223, NA, 1223, NA, NA), 
      s_1_2 = c(NA, 1223, NA, NA, NA), 
      s_1_2 = c(NA, NA, NA, NA, NA)) 

Disease0 <- paste("s_1_", 1:2, sep = "") 

Test$Tp2Diabetes_0_0 <- apply(Test, 1, function(Db) as.integer(any(Db[Disease0] == 1223, na.rm = TRUE))) 

Wenn ich diesen Code auf meinem kleinen Beispiel ausführen es funktioniert gut und gibt mir die Ergebnisse, die ich will.

Das Problem ist, dass ich dies auf einem Datensatz von über 500k ausführen und es nicht die gewünschten Ergebnisse produziert. Zum Beispiel zeigt es, dass nur 200 Menschen von den 500k Diabetes haben, aber die gesamte Datenschaufenster zeigt, dass ich näher an 3.000 haben sollte. Ich verstehe nicht, was hier vorgeht und was ich falsch mache.

+1

Vielleicht ist Ihr Datenmenge überprüfen. Wenn einer Ihrer Einträge als Text/Zeichen gespeichert wird, kann es sein, dass etwas Unsichtbares wie "1223" 'Aufzeichnungen Ihre Ergebnisse verfälscht. –

+0

definitiv ein Typ Problem. Einige 1223s in Ihren Daten sind nicht numerisch. ein Wert wie String "1223" würde deine Funktion stören. – fhlgood

+0

Danke für die Kommentare. Diese Variablen werden als ganze Zahlen klassifiziert. Ich habe versucht, alle zu numerisch zu konvertieren, sowie Whitespace zu trimmen, und ich habe die gleichen Ergebnisse erhalten. Irgendwelche Vorschläge, was man hier machen kann? Gibt es einen Befehl, den ich hinzufügen kann, der sowohl 1223 als auch "1223" enthält? Vielen Dank! – user7777508

Antwort

1

Sie für etwas einfacher wie das gehen sollte:

Test <- data.frame(
    s_1_1 = c(1223, NA, 1223, NA, NA), 
    s_1_2 = c(NA, 1223, NA, NA, NA), 
    s_1_2 = c(NA, NA, NA, NA, NA)) 
Test$Tp2Diabetes_0_0 <- rowSums(Test==1223,na.rm=TRUE)>0 

    s_1_1 s_1_2 s_1_2.1 Tp2Diabetes_0_0 
1 1223 NA  NA   TRUE 
2 NA 1223  NA   TRUE 
3 1223 NA  NA   TRUE 
4 NA NA  NA   FALSE 
5 NA NA  NA   FALSE 

Oder wenn Sie brauchen nur die ersten beiden Spalten als Indikatoren:

Test$Tp2Diabetes_0_0 <- rowSums(Test[,1:2]==1223,na.rm=TRUE)>0 
+0

ich brauchen würde, um Spaltennamen angeben ... Es gibt 3 separate Sammlung Termine für die Daten, und ich muß für jedes Datum eine Zählung haben. – user7777508

+0

Um nach dem Spaltennamen rufen: 'Prüfe $ Tp2Diabetes_0_0 <- rowSums (Test [c ("s_1_1", "s_1_2")] == 1223, na.rm = TRUE)> 0 ' –

+0

Was das Datum Zahl, I brauche mehr Informationen, da es keine Daten in deinem Beispiel gibt –