2017-08-23 9 views
0

で計算します。上記のデータフレームを持っています。日付&対応する信号値の時間。私は交換したら0 平均値、SD値、および置換値をR

  • ですべての正の値を交換する必要が

    1. for every 60 seconds、私はmeanStd devを計算し、多くのことを逸脱平均で値を交換する必要があります。例えば

    2017年8月23日午前7時49分58秒の値がSDからより多くを逸脱している場合、最初の60秒間、それは平均値で置き換えなければなりません。それは、 "59" が平均

    に置き換えられるべきであることを意味
     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 
    

    予想される出力:

    出力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 
    

    出力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** 
    

    -62 is mean and its replaced

  • +0

    「SDからもっとずれている」とはどういう意味ですか? – piptoma

    +0

    日付と時刻の変数を扱うときは、 'dput'を使ってサンプルデータを提供することが特に役に立ちます。これにより、データを切り取って貼り付けることができます。また、そのような質問に共通する潜在的な問題を診断するのにも役立ちます。 – lmo

    答えて

    2

    Rのループには使用しないでください。ベクター化されたソリューションを試してみてください。通常、パフォーマンスが必要な場合は、パッケージdata.tableが必要です。

    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) 
    

    解決方法はこれに似ています。 data.tableでcsvを読むことはfread関数で最も効果的です。

    +0

    エラーが発生しています。 data.tableを通してCSVを読む別の方法はありますか? – Anagha

    +0

    ありがとうございますが、分の列は警告をスローしています。おそらく、列の日時が文字列で日時オブジェクトではないため、すべての値はNA – Anagha

    +0

    です。 dt [、 'date-time':= as.POSIXct(' date-time')]を試してください。これが遅い場合は、fasttime :: fastPOSIXct()を使用します。 – mathdotrandom

    関連する問題