2016-01-24 162 views
2

比方說,我有一個數據幀如下:動態創建

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,在負值diff之後等於1。但是當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)))) 

我想它現在是有點明顯,如果這僅適用於需要兩個或更少1的按照diff -0.5。

任何幫助將不勝感激,除了dplyr之外,我也接受其他方法。數據本身是一個時間序列,diff是每個BID的另一個變量的當前值和滯後值之差。如果有其他信息可能會有所幫助,請告知我們。

回答

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,直到它找到一個正數。

+0

我不認爲這是所需的輸出。這裏也應該有'NAs'。 –

+0

感謝您的建議,它比我所得到的更接近。不幸的是大衛是正確的,因爲它不是理想的輸出。最重要的是,因爲它忽略了團體。例如,'df $ neg [20]'當然不應該是1.我試圖用data.table來解決一個功能性的解決方案,但它肯定是效率低下的。 – James