2016-06-29 3 views
1

So habe ich viele Daten in der Form (4 Werte für jeden Tag)Wie berechnet man Mittel aus Datenrahmen in R für eine Variable mit einer bestimmten Menge an NAs oder gar keine NAs?

date  var1  var2 
1 2003-10-28 1.2  970  
2 2003-10-28  NA  510  
3 2003-10-28  NA  640  
4 2003-10-28  NA  730  
5 2003-10-30 2.0  570  
6 2003-10-30  NA  480  
7 2003-10-30 1.2  580  
8 2003-10-30 1.2  297  
9 2002-05-07 3.0  830  
10 2002-05-07 4.8  507  
11 2002-05-07 4.8  253  
12 2002-05-07  NA  798  

und ich brauche für jeden Tag Summen für var1 zu berechnen, falls es zum Beispiel weniger als 2 NA-Werte (oder keine ist) für dieses spezifische Datum und ansonsten sollte dieses Datum ignoriert werden. Zur gleichen Zeit sollte ich Mittel von var2 für die gleichen Daten berechnen, WENN die Summe für var1 auch berechnet wurde. Dann sollte ich diese Mittel, Summen und Daten in einem anderen Datenrahmen speichern, so dass diese ignorierten Daten nicht da sind.

Ich habe alle Arten von Schleifenstrukturen ausprobiert, aber ich bin verwirrt durch die Tatsache, dass Mittelwert und Summe für die Daten berechnet werden müssen, wo überhaupt keine NAs vorhanden sind. Auch das Speichern der Daten, Mittel und Summen bringt mich in Schwierigkeiten, weil ich keine Ahnung habe, wie man die Indexierung richtig macht.

so erwartete Ausgabe von diesen Beispieldaten aussehen sollte

date  sum(var1) mean(var2) 
1 2003-10-30 4.8   480.75 
2 2002-05-07 17.4  561.75 
+1

Bitte die erwartete Ausgabe und Ihren Code hinzufügen (auch wenn es nicht funktioniert). – zx8754

+0

http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-beispiel – Sumedh

Antwort

0

dplyr verwenden. Angenommen, Ihre ursprünglichen Daten-Set ist df

library(dplyr) 
df %>% group_by(date) %>% filter(sum(is.na(var1)) <= 2)%>% summarise(Sum = sum(var1, na.rm = T), Mean = mean(var2, na.rm = T)) 

Daten

df <- read.table(text = "   date var1 var2 
1 2003-10-28 1.2 970 
2 2003-10-28 NA 510 
3 2003-10-28 NA 640 
4 2003-10-28 NA 730 
5 2003-10-30 2.0 570 
6 2003-10-30 NA 480 
7 2003-10-30 1.2 580 
8 2003-10-30 1.2 297 
9 2002-05-07 3.0 830 
10 2002-05-07 4.8 507 
11 2002-05-07 4.8 253 
12 2002-05-07 NA 798",header =TRUE) 

Ausgabe

Source: local data frame [2 x 3] 

    date Sum Mean 
    (date) (dbl) (dbl) 
1 2002-05-07 12.6 597.00 
2 2003-10-30 4.4 481.75 
1

Hier ist eine Option mit data.table. Konvertiere das 'data.frame' in 'data.table' (setDT(df1)), gruppiert nach 'date' if Die Anzahl der NA-Werte in 'var1' ist kleiner als 3, dann erhält man die sum von 'var1' und mean von 'var2 ".

library(data.table) 
setDT(df1)[,if(sum(is.na(var1)) < 3) .(Sum = sum(var1, na.rm=TRUE), 
      Mean = mean(var2, na.rm=TRUE)) , by = date] 
#   date Sum Mean 
#1: 2003-10-30 4.4 481.75 
#2: 2002-05-07 12.6 597.00 
+1

immer gute Antworten geben – nik

Verwandte Themen