排除变量及其附近的变量 - dplyr

时间:2018-05-16 18:11:15

标签: r if-statement dplyr melt microclimate

我有一个数据集,它是多个数据记录器的输出,每隔1小时测量温度和勒克斯(光强度)。
有约。 250,000个数据点。我遇到了来自“太阳斑”的温度读数的问题,其中一盏灯撞击记录器,快速加热,然后在一天的剩余时间内给出“温暖”的读数。我可以使用dplyr对这些数据进行子集化(即LUX> 32,000)但是如果记录器的LUX> 32,000读数,我想从那天删除所有读数。对于ref,每个数据记录器都有一个名称,日期和时间。时间变量。

有没有办法用dplyr做到这一点?

2 个答案:

答案 0 :(得分:1)

如果我没记错,filter对分组数据效果不佳,所以我首先按时间对数据框进行排序(如果您的数据已经适当排序,则可能不需要这样做)。然后,对于每个记录器和日期,我在LUX > 32000事件之后识别所有点并标记它们。完成后,过滤器应该可以工作。

df %>%
  arrange(name, date, time) %>% 
  group_by(name, date) %>%
  mutate(
    fleck = cumsum(LUX > 32000) > 0
  ) %>%
  ungroup() %>%
  filter(!fleck)

修改

如果要删除整天,可以更改fleck变量的定义方式。例如,

fleck = any(LUX > 32000)

答案 1 :(得分:0)

你可以使用这样一个简单的函数:

beforeafter <- function(lgl, before=1L, after=1L, default=FALSE) {
  befores <- if (before > 0L) sapply(seq_len(before), function(i) c(tail(lgl, n=-i), rep(default, i))) else c()
  afters <- if (after > 0L) sapply(seq_len(after), function(i) c(rep(default, i), head(lgl, n=-i))) else c()
  apply(cbind(befores, lgl, afters), 1, any)
}

vec <- (1:10 == 5)
vec
#  [1] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
beforeafter(vec)
#  [1] FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE
beforeafter(vec, before=2, after=0)
#  [1] FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE

举个例子:

rownames_to_column(mtcars) %>%
  select(rowname, cyl, gear) %>%
  filter(cyl == 4L, gear == 3L)
#         rowname cyl gear
# 1 Toyota Corona   4    3

rownames_to_column(mtcars) %>%
  select(rowname, cyl, gear) %>%
  filter(beforeafter(cyl == 4L & gear == 3L))
#            rowname cyl gear
# 1   Toyota Corolla   4    4
# 2    Toyota Corona   4    3
# 3 Dodge Challenger   8    3

如果您的数据是固定频率并且您想要从已知问题中删除某些常量样本中的所有观察值,则此方法很有效。当你想要&#34;在一段时间内#34;它不会起作用。来自变频数据。为此,我认为你需要dist迭代地对所有&#34;已知的坏&#34;分。