我有一个非常大的数据集(1,017,211行),其中包含以1秒为间隔收集的压力数据。压力会出现随机峰值,我需要消除它们。数据(df)看起来像这样——一列表示压力、日期和时间,我创建了一个索引代替秒。我从数据中包含了大约50行,它们都需要设置为0。
dput(df[9549:9600,])
structure(list(Pressure = c(0, 10272, 10270, 10270, 10307,
10332, 10336, 10336, 10335, 10335, 10335, 10336, 10333, 10333,
10332, 10330, 10330, 10329, 10328, 10328, 10328, 10328, 10327,
10327, 10326, 10326, 10325, 10325, 10324, 10324, 10323, 10323,
10323, 10322, 10322, 10321, 10321, 10321, 10321, 10320, 10320,
10320, 10319, 10318, 10318, 10317, 10318, 10388, 10581, 10787,
11007,0 ), DateTime = structure(c(1611279415, 1611279416, 1611279417,
1611279418, 1611279419, 1611279420, 1611279421, 1611279422, 1611279423,
1611279424, 1611279425, 1611279426, 1611279427, 1611279428, 1611279429,
1611279430, 1611279431, 1611279432, 1611279433, 1611279434, 1611279435,
1611279436, 1611279437, 1611279438, 1611279439, 1611279440, 1611279441,
1611279442, 1611279443, 1611279444, 1611279445, 1611279446, 1611279447,
1611279448, 1611279449, 1611279450, 1611279451, 1611279452, 1611279453,
1611279454, 1611279455, 1611279456, 1611279457, 1611279458, 1611279459,
1611279460, 1611279461, 1611279462, 1611279463, 1611279464, 1611279465
), class = c("POSIXct", "POSIXt"), tzone = ""), Index = 9549:9600), row.names = 9549:9600, class = "data.frame")
我的目标是编写一个函数/循环/脚本,如果压力超过10,000的时间少于2分钟,则将压力读数发送到0(或NA或任何小于10,000)。例如,如果压力在+/- 11000左右徘徊1分钟,这60个压力数据点将被发送到0。
设置10,000的标记是因为我不太担心低于10,000的东西。最具挑战性的是正确编码时间方面,我甚至不确定R是否可以轻松做到这一点。
我试着做一个for循环,只看10,000以上的压力读数,并试图把时间加起来,看看花费在10,000以上的时间是否少于2分钟(120秒):
for (i in df$Pressure) {
if(df$Pressure > 10000 & sum(nrow(df$Index)) < 120) {
df$Pressure = 0
} else(df$Pressure <- df$Pressure)
}
这会导致错误:"条件有长度>
只使用第一个元素">我也尝试使用setDT(),正如其他人所建议的(如在这里-从一个df的两个列的另一个df的总和值):
pressure.df <- setDT(df)[Pressure > 10000 & sum(nrow(Index)) < 120, Pressure := 0]
这将导致数据帧将每个超过10,000的值发送到0。
任何帮助将不胜感激,没有必要使用索引计算时间如果使用DateTime列会更好。
与data.table
和dplyr
:
我们可以使用data.table::rleid
进行分组,每组使用n()
。然后对每个组使用replace
替换满足条件的所有值(Pressure>1000和<60行)。下面的答案只有在每秒钟严格观察一次的情况下才成立。如果缺少行或存在重复的DateTime值,则可能产生不一致的结果
library(data.table)
lbrary(dplyr)
df %>% group_by(rleid=data.table::rleid(Pressure>10000)) %>%
mutate(Pressure=replace(Pressure, n()<60 & Pressure >10000, 0)%>%
ungroup()