2012-07-03 61 views
1

我有我想轉換成R兩個Excel函數:轉換Excel函數爲R

numberShares 
=IF(AND(N213="BOH",N212="BOH")=TRUE,P212,IF(AND(N213="BOH",N212="Sell")=TRUE,ROUNDDOWN(Q212/C213,0),0)) 

marketValue 
=IF(AND(N212="BOH",N213="BOH")=TRUE,C213*P212,IF(AND(N212="Sell",N213="Sell")=TRUE,Q212,IF(AND(N212="BOH",N213="Sell")=TRUE,P212*C213,IF(AND(N212="Sell",N213="BOH")=TRUE,Q212)))) 

所引用的單元包括:股票的

  • C =收盤價的
  • N =位置值或者「購買或持有」或「賣」
  • p =股份
  • q =市場價值的數量,如suming $ 10,000個初始股本(股數*收盤價)

和兩個輸出列的我試圖重新創建這個樣子的頂部: output

到目前爲止,RI構建了一個數據幀與必要的四列: data.frame

我只是不知道如何編寫將填充股數和市場價值列的函數。 For循環?如果別的?

再次,謝謝!

+4

你在'ifelse()'的正確軌道上。還要看'邏輯','比較'和'圓'。您應該或多或少地能夠通過現有的代碼來替代R等價物,它會起作用。 – Chase

+0

我建議使用更傳統的'if else else {}'語句。 'ifelse()'並不總是以直觀的方式發揮作用。 –

+0

@BrandonBertelsen我同意,理解'if'和'ifelse'之間的區別很重要。 'if'應該用於控制語句,它只需要一個邏輯參數,而'ifelse'則需要一個向量參數。 – Andrie

回答

3

隱瞞AND()的中綴「&」; 「=」到「==」;和IF的ifelse(),你在一半。這個問題將在轉換的單元格引用數組或矩陣的參考,併爲這項任務,我們會需要的數據佈局的更好的描述:

numberShares <- 
    ifelse(N213=="BOH" & N212=="BOH", 
     #Perhaps PosVal[213] == "BOH" & PosVal[212] == "BOH" 
     # ... and very possibly the 213 should be 213:240 and the 212 should be 212:239 
      P212, 
      ifelse(N213=="BOH" & N212=="Sell" , 
         round(Q212/C213, digits=0), 
         0)) 

(你似乎回到這似乎preeety懷疑不適應值。)假設這是正確的代碼,儘管我的疑慮下一個翻譯涉及在這種結構中應用相同的置換(雖然你似乎缺少一個else - 結論在最後IF函數:

marketValue <- 
IF(AND(N212="BOH", N213="BOH")=TRUE, 
      C213*P212, 
      IF(AND(N212="Sell",N213="Sell")=TRUE, 
        Q212, 
        IF(AND(N212="BOH",N213="Sell")=TRUE, 
          P212*C213, 
          IF(AND(N212="Sell",N213="BOH")=TRUE, 
             Q212)))) 

(您的AND(.,.)=TRUE測試我相信在Excel中是不必要的,在R中肯定沒有必要)

+0

謝謝!我對excel中的條件語句很陌生,太哈哈如何在R中引用單元格,例如「以前的位置」。我已經用所有合適的數據構建了一個數據框,並且可以幫助您,可能 – jonnie

+0

謝謝!我在Excel中也是新的條件語句!我如何引用R中的單元格,例如「之前的位置」。我已經用所有適當的數據構建了一個數據框,但不知道如何區分Df $ position [i]和Df $ position [i-1] – jonnie

+1

R中沒有「前一個位置」的概念。Reduce功能可讓您沿矢量「滾動」。 For循環可以使用。您也可以用vec [-length(vec)] - vec [-1]'從(縮寫的)向量中減去移位向量。如果操作是「 - 」,當然有'diff'函數可以在一次調用中完成。還有一個非常有用的功能,名爲「嵌入」。 –