基于R中的先前值动态创建数组

时间:2016-01-24 19:52:57

标签: r dataframe dplyr

我们假设我的数据框如下:

   BID diff
 1   1 NA
 2   1 0.0
 3   1 0.0
 4   1 -0.5
 5   1 0.0
 6   1 0.0
 7   1 0.0
 8   1 0.5
 9   1 0.0
10   1 0.0
11   2 NA
12   2 0.0
13   2 0.0
14   2 0.0
15   2 -0.5
16   2 0.0
17   2 0.0
18   2 0.0
19   2 0.0
20   3 NA
21   3 0.5
22   3 0.0
23   3 -0.5
24   3 0.5

我想要做的是,对于每个BID,创建一个新的变量neg,在负diff值之前等于0,在否定之后等于1 { {1}}价值。但是,当diff再次更改时,它应该停止。 E.g。

diff

我尝试使用 BID diff neg 1 1 NA 0 2 1 0.0 0 3 1 0.0 0 4 1 -0.5 NA 5 1 0.0 1 6 1 0.0 1 7 1 0.0 1 8 1 0.5 NA 9 1 0.0 NA 10 1 0.0 NA 11 2 NA 0 12 2 0.0 0 13 2 0.0 0 14 2 0.0 0 15 2 -0.5 NA 16 2 0.0 1 17 2 0.0 1 18 2 0.0 1 19 2 0.0 1 20 3 NA NA 21 3 0.5 NA 22 3 0.0 0 23 3 -0.5 NA 24 3 0.5 NA 接近正在运行的' 1,如下所示:

dplyr

我认为现在有点明显,只有在data <- data %>% group_by(BID) %>% mutate(neg = as.numeric( ifelse(lag(diff) == -0.5, 1, ifelse(((lag(neg) == 1) & (diff == 0.0)), lag(neg), 0)))) 中的-0.5之后需要两个或更少的1时,这才有效。

非常感谢任何帮助,除了diff之外,我对其他方法持开放态度。数据本身是一个时间序列,dplyr是另一个变量的每个BID的当前和滞后值之间的差异。如果有任何其他信息可能有帮助,请告诉我。

1 个答案:

答案 0 :(得分:1)

这可能不是最有效的方法,但是你去了:

df <- read.table(text = '   BID diff
                 1   1 NA
                 2   1 0.0
                 3   1 0.0
                 4   1 -0.5
                 5   1 0.0
                 6   1 0.0
                 7   1 0.0
                 8   1 0.5
                 9   1 0.0
                 10   1 0.0
                 11   2 NA
                 12   2 0.0
                 13   2 0.0
                 14   2 0.0
                 15   2 -0.5
                 16   2 0.0
                 17   2 0.0
                 18   2 0.0
                 19   2 0.0
                 20   3 NA
                 21   3 0.5
                 22   3 0.0
                 23   3 -0.5
                 24   3 0.5', header = FALSE)

df[is.na(df)] <- 0
df$neg <- 0

for (i in 1:length(df$diff)) {
  flag <- ifelse(df$diff[i] < 0, 1, 0)
  if (flag == 1) {
    for (j in i:length(df$diff)) {
      if (df$diff[j] > 0) {
        flag <- 0
        break
      } else {
        df$neg[j] <- 1
      }
    }
  }
}

df$neg[df$diff < 0] <- 0
df
##    BID diff neg
## 1    1  0.0   0
## 2    1  0.0   0
## 3    1  0.0   0
## 4    1 -0.5   0
## 5    1  0.0   1
## 6    1  0.0   1
## 7    1  0.0   1
## 8    1  0.5   0
## 9    1  0.0   0
## 10   1  0.0   0
## 11   2  0.0   0
## 12   2  0.0   0
## 13   2  0.0   0
## 14   2  0.0   0
## 15   2 -0.5   0
## 16   2  0.0   1
## 17   2  0.0   1
## 18   2  0.0   1
## 19   2  0.0   1
## 20   3  0.0   1
## 21   3  0.5   0
## 22   3  0.0   0
## 23   3 -0.5   0
## 24   3  0.5   0

发生的事情是:每当它在diff中找到负数时,它会设置一个标志,并将以下所有值更改为1,直到找到正数。