有两个条件错误的“如果”

时间:2019-07-12 23:36:36

标签: r if-statement

我试图获取$last_200_low列更改的确切行,并且后面的3行具有与实际行相同的值。我遇到了2种不同的错误和一种几乎可以解决问题的解决方案。有提示吗?

> df
               data_hora last_200_low
4070 2018-02-01 09:39:20       3200.5
4071 2018-02-01 09:39:20       3200.5
4072 2018-02-01 09:39:20       3200.5
4073 2018-02-01 09:39:20       3200.5
4074 2018-02-01 09:39:23       3200.0
4075 2018-02-01 09:39:24       3199.5
4076 2018-02-01 09:39:25       3199.0
4077 2018-02-01 09:39:25       3198.5

我正在寻找的结果是:

             data_hora last_200_low
[1]2018-02-01 09:39:20       3200.5

不是这个...

df[diff(df$last_200_low) != 0, ]

4073 2018-02-01 09:39:20       3200.5
4074 2018-02-01 09:39:23       3200.0
4075 2018-02-01 09:39:24       3199.5
4076 2018-02-01 09:39:25       3199.0

我尝试过的其他解决方案:

第一个:

i <- 1
if (diff(df$last_200_low) != 0 & df$last_200_low[i] == df$last_200_low[i - 3]) {
     print(df[i])
     i <- i + 1
 }

Warning message:
In if (diff(df$last_200_low) != 0 & df$last_200_low[i] ==  :
  the condition has length > 1 and only the first element will be used

第二个:

 if (diff(df$last_200_low[i]) != 0 & df$last_200_low[i] == df$last_200_low[i - 3]) {
     print(df[i])
     i <- i + 1
 }

Error in if (diff(df$last_200_low[i]) != 0 & df$last_200_low[i] ==  : 
  argument is of length zero

我尝试了多种方法来创建具有diff功能的向量,但是它总是使列表的值比实际数据帧小。

4 个答案:

答案 0 :(得分:3)

要获得等于data.frame长度的向量,可以结合逻辑:

c(diff(df$last_200_low) != 0, FALSE)

第二个问题有点相似。 df[i-3, ]的取值为df[-2, ],这不是您想要的。看到回报:

> DF$last_200_low[-2]
[1] 3200.5 3200.5 3200.5 3200.0 3199.5 3199.0 3198.5

# versus df$last_200_low[i]
> DF$last_200_low[1]
[1] 3200.5

您可以使用合并和填充的思想为子集获取适当大小的向量:

c(rep(FALSE, 3), diff(DF$last_200_low, lag = 3) == 0)
[1] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE

将所有内容放在一起将为您提供:

DF <- data.frame(ID = 4070:4077, last_200_low = c(rep(3200.5,4), 3200.0, 3199.5, 3199.0, 3198.5))
n_lag <- 3

DF[c(diff(DF$last_200_low) !=0, FALSE) 
   & c(rep(FALSE, n_lag), diff(DF$last_200_low, lag = n_lag) == 0)
   , ]

    ID last_200_low
4 4073       3200.5

答案 1 :(得分:1)

使用data.table:

library('data.table')
func <- function(dt) unique(dt[, .(N = .N), by = data_hora][N >= 3]$data_hora)
dt[c(diff(last_200_low),0) != 0 & data_hora %in% func(dt)]

答案 2 :(得分:0)

更新1

误解了问题,因此进行修改以根据要求显示最后一个匹配值。

样本数据:

            data_hora last_200_low
1 2018-02-01 09:39:20       3200.5
2 2018-02-01 09:39:20       3200.5
3 2018-02-01 09:39:20       3200.5
4 2018-02-01 09:39:23       3200.0
5 2018-02-01 09:39:24       3199.5

下面应使用lagtail在数据顶部给出具有相同值的最后一行:

dfindex <- (df$last_200_low == lag(df$last_200_low))
tail(df11[dfindex,],1)

结果:

            data_hora last_200_low
3 2018-02-01 09:39:20       3200.5

示例数据的输入量

df <- structure(list(data_hora = structure(c(1L, 1L, 1L, 2L, 3L), .Label = c("2018-02-01 09:39:20", 
"2018-02-01 09:39:23", "2018-02-01 09:39:24"), class = "factor"), 
    last_200_low = c(3200.5, 3200.5, 3200.5, 3200, 3199.5)), class = "data.frame", row.names = c(NA, 
-5L))

答案 3 :(得分:0)

您可以使用data.table和shift函数实现所需的目标:

library(data.table)
df <- data.table(df)


df<- df[, ':='(x=ifelse(shift(last_200_low,1,type='lead')!=last_200_low,1,0),
           y=ifelse(shift(last_200_low,3,type='lag')==last_200_low,1,0))][x+y>1, list(row, data_hora,last_200_low),]


> df
     data_hora last_200_low 
4070 01-02-18 9:39       3200.5 

简单而在线的代码! 希望对您有帮助!