我们假设我的数据框如下:
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的当前和滞后值之间的差异。如果有任何其他信息可能有帮助,请告诉我。
答案 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,直到找到正数。