我试图获取$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功能的向量,但是它总是使列表的值比实际数据帧小。
答案 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)
误解了问题,因此进行修改以根据要求显示最后一个匹配值。
样本数据:
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
下面应使用lag
和tail
在数据顶部给出具有相同值的最后一行:
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
简单而在线的代码! 希望对您有帮助!