2017-04-21 18 views
0
date  A B C 
11/24/2016 0 -1 -1 
11/23/2016 -1 -1 -1 
11/22/2016 0 -1 -1 
11/21/2016 0 -1 -1 
11/18/2016 -1 -1 -1 
11/17/2016 -1 -1 -1 
11/16/2016 -1 -1 -1 
11/15/2016 -1 -1 -1 
11/14/2016 -1 -1 -1 
11/11/2016 -1 -1 -1 
11/10/2016 0 -1 0 
11/9/2016 0 -1 0 

C的excel命令(假設數據從第2行開始)爲=IF(A2=-1, -1, IF(AND(B2=-1,C3=-1),-1,0))。所以基本上,如果列A是-1,那麼列C也將是-1。否則,我們將檢查是否B2=-1以及C下面的行是否爲-1。在Excel中,我可以通過簡單地複製/粘貼公式來完成此操作,並且C列會自動更新。我不認爲這是相當的R.R - 從Excel複製IF()邏輯命令到R

在R作爲簡單的,我有一個山坳AB價值觀,我想用這些列創建C像我如何通過Excel中一樣。然而,我一直在想如何做到這一點已經有一段時間了。這是因爲'C'依賴於'A',如果失敗則取決於'B'和它自身的滯後值。幫助將非常感謝!

編輯:我有一些想法,可能工作。

for (i in 1:length(dat[,1])){ 

     dat[i,3] <- ifelse(dat[i,1]==-1, -1, 0) 

     } 

運行第一循環之後,我得到:

A B V3 
1 0 -1 0 
2 -1 -1 -1 
3 0 -1 0 
4 0 -1 0 
5 -1 -1 -1 
6 -1 -1 -1 
7 -1 -1 -1 
8 -1 -1 -1 
9 -1 -1 -1 
10 -1 -1 -1 
11 0 -1 0 
12 0 -1 0 

現在的第二個條件:

for (i in 2:length(dat[,1])){ 

     dat[i-1,3] <- ifelse(dat[i-1,2]==-1&dat[i,3]==-1, -1, dat[i,3]) 

     } 

對於第二個條件,我希望的是,for()將檢查在它之前的行並且迭代地填充-1 s,只要在C中的當前行之前存在-1行,並且-1一個當前行中B.然而,在這結束返回:

A B V3 
1 0 -1 -1 
2 -1 -1 0 
3 0 -1 0 
4 0 -1 -1 
5 -1 -1 -1 
6 -1 -1 -1 
7 -1 -1 -1 
8 -1 -1 -1 
9 -1 -1 -1 
10 -1 -1 0 
11 0 -1 0 
12 0 -1 0 

我需要row2留爲-1,這樣row3可以得到填補爲-1。

+2

所以你已經有'C'列的值了嗎? –

+0

@Ronak Shah對不起!應該澄清。我在R中有'A'和'B'的值,我想用這些來創建'C',就像我在Excel中做的一樣。將編輯我的文章! – Nikitau

+0

'dplyr :: case_when'可以很好地處理:'library(dplyr); df%>%mutate(C = case_when(A == -1〜-1,B == -1&lead(C)== -1〜-1,TRUE〜0))'否則可以使用嵌套'ifelse '電話,但那會變得混亂。 – alistaire

回答

0

在R中可以使用 'ifelse' 功能:

x<-data.set.name 
y<-ifelse(x$A==-1,-1,ifelse(x$B==-1 & X$C==-1,-1,0)) 

這應該這樣做。

+1

但是,您需要從下一行獲取'C'的值。 – alistaire

+0

嗨,我認爲這可能是「鉛」或「滯後」C?另外,我遇​​到的問題是'C'實際上並沒有在R中生成。在Excel中,我能夠複製/粘貼公式並使列'C'自動更新自己。我不太確定這是如何在R. – Nikitau

+0

@alistaire Yup中工作的。並且使事情複雜化,我不得不在R.中產生'C'。 – Nikitau

1

問題是,因爲您正在從您計算的以下值中繪製,因此需要從底部開始計算,因爲這些值可能會一直到頂部。 Reduceright = TRUEaccumulate = TRUE可以創建邏輯:

df$C <- sapply(
    Reduce(
     function(x, y){ 
      if (x[[1]] == -1) { -1 } else if (x[[2]] == -1 & y[[1]] == -1) { -1 } else { 0 } 
     }, 
     Map(c, df$A, df$B), right = TRUE, accumulate = TRUE), 
    `[`, 1) 

df 
#>   date A B C 
#> 1 11/24/2016 0 -1 -1 
#> 2 11/23/2016 -1 -1 -1 
#> 3 11/22/2016 0 -1 -1 
#> 4 11/21/2016 0 -1 -1 
#> 5 11/18/2016 -1 -1 -1 
#> 6 11/17/2016 -1 -1 -1 
#> 7 11/16/2016 -1 -1 -1 
#> 8 11/15/2016 -1 -1 -1 
#> 9 11/14/2016 -1 -1 -1 
#> 10 11/11/2016 -1 -1 -1 
#> 11 11/10/2016 0 -1 0 
#> 12 11/9/2016 0 -1 0 

由於它運行的每一行的迭代器,它不會是非常快的,但將罰款1K行。

所有這一切,這裏的邏輯是可疑的,你應該在上下文中仔細考慮你的計算是否有意義。

+0

謝謝!我不知道'減少'可以做到這一點。對於我的原始數據,這是一個data.frames列表,我有點困難。如果我的原始示例數據是我的許多data.frames(df [[1]]中的一個以返回所有列,而df [[1]] [,3]以檢索列C),那麼我將如何實現上述代碼? – Nikitau

+0

您可以將整個事件映射到'lapply'內部的列表中,或者data.frame無論如何都是相似的,將它們綁定到一個大數據框中,並帶有一個ID列,它們來自哪個元素('dplyr :: bind_rows'與它的'.id'參數設置使這變得簡單),並按組應用它。你也可以看看'purrr',它有很多用於處理列表的工具。 – alistaire