计算均值、SD 并替换 R 中的值
Calculate Mean, SD, and replace values in R
我有上面的数据框,日期和时间以及相应的信号值。
- 我需要用0替换所有正值
- 替换后,
for every 60 seconds
,我需要计算mean
和Std dev
,并将值替换为偏差很大的均值。
例如,对于前 60 秒,如果 2017-08-23 07:49:58 处的值与 SD 的偏差较大,则应将其替换为均值。这意味着“59”应该被替换为 mean
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
不要在 R 中使用 for 循环。尝试使用向量解决方案,如果您需要性能,通常包 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替换所有正值
- 替换后,
for every 60 seconds
,我需要计算mean
和Std dev
,并将值替换为偏差很大的均值。
例如,对于前 60 秒,如果 2017-08-23 07:49:58 处的值与 SD 的偏差较大,则应将其替换为均值。这意味着“59”应该被替换为 mean
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
不要在 R 中使用 for 循环。尝试使用向量解决方案,如果您需要性能,通常包 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。