2017-08-23 1 views
0

Ich habe den obigen Datenrahmen, Datum & Zeit mit entsprechendem Signalwert.Berechne Mittelwert, SD und ersetze Werte in R

  1. Ich brauche mit 0
  2. Sobald ersetzt all positiven Wert zu ersetzen, for every 60 seconds, ich brauche mean und Std dev zu berechnen und den Wert mit dem Mittelwert ersetzen, die eine Menge abweicht.

Zum Beispiel für die ersten 60 Sekunden, wenn der Wert am 2017.08.23 07.49.58 wird mehr von SD abweicht, dann sollte es durch den Mittelwert ersetzt werden. Das bedeutet, dass "59" sollte durch den Mittelwert

ersetzt werden
 date-time    RSSI 
    2017-08-23 07:49:38 -68 
    2017-08-23 07:49:48 -69 
    2017-08-23 07:49:58 -59 
    2017-08-23 07:50:08 -65 
    2017-08-23 07:50:18  127 
    2017-08-23 07:50:28 -74 
    2017-08-23 07:50:38  127 
    2017-08-23 07:50:48 -74 
    2017-08-23 07:50:58  127 
    2017-08-23 07:51:08 -74 
    2017-08-23 07:51:18 -65 
    2017-08-23 07:51:28  127 
    2017-08-23 07:51:38 -59 
    2017-08-23 07:51:48 -62 
    2017-08-23 07:51:58 -57 

Erwartete Ausgabe:

Ausgang 1:

date-time    RSSI 
    2017-08-23 07:49:38 -68 
    2017-08-23 07:49:48 -69 
    2017-08-23 07:49:58 -59 
    2017-08-23 07:50:08 -65 
    2017-08-23 07:50:18 0 

Ausgang 2:

date-time    RSSI 
    2017-08-23 07:49:38 -68 
    2017-08-23 07:49:48 -69 
    2017-08-23 07:49:58 **-62** 
    2017-08-23 07:50:08 -65 
    2017-08-23 07:50:18 **-62** 

Hier -62 is mean and its replaced

+0

was meinst du mit "ist mehr von SD abweichen"? – piptoma

+0

Bei der Arbeit mit Datums- und Zeitvariablen ist es besonders hilfreich, Ihre Beispieldaten mit 'dput' bereitzustellen. Dies ermöglicht es uns, die Daten auszuschneiden und einzufügen und hilft uns dabei, einige potenzielle Probleme zu diagnostizieren, die bei solchen Fragen häufig auftreten. – lmo

Antwort

2

Verwenden Sie keine for-Schleifen in R. Versuchen Sie, vektorielle Lösungen zu verwenden, und wenn Sie Leistung benötigen, ist normalerweise das Paket data.table das Richtige.

library(data.table) 
dt = data.table("date-time"=c(as.POSIXct(c("2017-08-23 07:49:38", "2017-08-23 07:49:48", "2017-08-23 07:49:58", "2017-08-23 07:50:08", "2017-08-23 07:50:18", "2017-08-23 07:50:28"))), RSSI=c(-68, -69, -59, -65, 127, -74)) 

dt[RSSI > 0 , RSSI:=NA] #replacing positive ones with NA 
print(dt) 
dt[ , minute:=floor(as.numeric(`date-time`)/60)] # calculate for each time in which minute it belongs 
# calculate mean and standard deviation per group 
dt[ , c("mean", "stdev") := list(mean(RSSI, na.rm=TRUE), sd(RSSI, na.rm=TRUE)), by = minute] #ignoring the NA outliers 
dt[ abs(RSSI - mean) > stdev | is.na(RSSI), RSSI:=round(mean)] #round should return an integer 
print(dt) 

Die gewünschte Lösung sollte ähnlich aussehen. Das Lesen eines CSV mit data.table funktioniert am besten mit der Funktion fread.

+0

Es wird ein Fehler ausgegeben. Gibt es eine andere Möglichkeit, CSV über data.table zu lesen? – Anagha

+0

Danke, aber die Minute Spalte wirft Warnung, und alle Werte sind NA – Anagha

+0

wahrscheinlich, weil Ihre Spalte Datum-Uhrzeit eine Zeichenfolge und kein Datum-Uhrzeit-Objekt ist. Probieren Sie dt [, 'date-time': = as.POSIXct (' date-time')] aus. Wenn dies langsam ist, verwenden Sie fasttime :: fastPOSIXct(). – mathdotrandom

Verwandte Themen