2017-08-23 50 views
0

我有上面的数据帧,日期&有相应信号值的时间。计算平均值,标准差和替换值R

  1. 我需要0
  2. 更换一次,for every 60 seconds,我需要计算meanStd dev和与偏离很多平均值替换值,以取代所有的正值。

例如,对于前60秒,如果2017-08-23 07:49:58的值偏离了SD的偏差,则应该用平均值代替。这意味着 “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中使用for循环尝试并使用矢量化解决方案,并且如果需要性能,通常需要package 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