【问题标题】:select rows based on multiple criteria in moving window of 3在 3 的移动窗口中根据多个条件选择行
【发布时间】:2014-08-21 04:46:35
【问题描述】:

我的数据框有四个变量。

DF <- read.table(text="  v1       v2      v3      v4
 175     14.842   3.06   3300.00
 176     0.777    3.21   80
 177     4.770    4.15   39.28
 178     10.450   6.24   50.36
 179     0.507    6.27   0.48
 180     0.037    3.31  -47.21
 181     15.627   6.28   89.73
 182     57.856   16.90  169.11
 183     26.457   20.10  70
 184     1.482    20.29  0.95
 185     0.842    20.45  0.79", header=TRUE)

在 3 的移动窗口中,即 (175,176,177)、(176,177,178)、(177,178,179)、(178,179,180) 等,在 v4 列中,如果所有三个 v4 都 > -30,我想打印中间行。例如,如果 175,176,177 中的 v4 均 > -30,则存储 176,如果 (176,177,178) 中的 v4 均大于 > -30,则存储 177,以此类推。

以下代码(由 Roland 提供)完成了这项工作。 https://stackoverflow.com/questions/24453810/test-criteria-for-a-moving-window-of-3-rows-in-a-data-frame/24454255#24454255.

ind <- DF$v4 > -30
ind <- filter(ind, rep(1, 3)) == 3L
ind[is.na(ind)] <- FALSE
DF[ind, ]
#   v1     v2    v3     v4
#2 176  0.777  3.21  80.00
#3 177  4.770  4.15  39.28
#8 182 57.856 16.90 169.11 

但是我需要对代码做些小改动。除了所有三个 v4 > -30,第一个(三个)的 v3 值应该大于 2.5。例如,在 (175,176,177) 中,如果所有的 v4 > -30 且 175 的 v3 > 2.5,则存储 176。对于 (176,177,178),如果所有三个的 v4 > -30 且 176 的 v3

再次感谢。

【问题讨论】:

  • 那么你的代码在哪里?不正确也没关系,但您肯定自己已经尝试过吗?

标签: r loops dataframe conditional-statements


【解决方案1】:

试试这个:

library(zoo)

 ok <- function(ix) with(DF[ix, ], all(v4 > -30) & v3[1] > 2.5)
 DF[ rollapply(1:nrow(DF), 3, ok, fill = FALSE), ]

给予:

    v1     v2    v3     v4
2  176  0.777  3.21  80.00
3  177  4.770  4.15  39.28
4  178 10.450  6.24  50.36
8  182 57.856 16.90 169.11
9  183 26.457 20.10  70.00
10 184  1.482 20.29   0.95

请注意,示例数据中v3 始终大于 2.5,因此条件在此处无效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    相关资源
    最近更新 更多