2017-03-02 113 views
1

我有一個數據集如下:嵌入式Ifelse聲明

Source  Rev_Diff Cost_Diff  Price_Diff  Sales_Diff  
    A   -10   10    11    12 
    B   11   -10   -10    11 
    C   -12   10    10    -11 
    D   -11   -11   -10    -12 

如何添加一列,其中:

「如果Rev_Diff小於0, 打印‘成本’,如果‘Cost_Diff’與金額小於0, 如果金額小於0的「Price_Diff」打印「價格」, 如果金額小於0的「Sales_Diff」打印「銷售額」,則其他打印「我們上漲」

最終產出:

Source  Rev_Diff Cost_Diff  Price_Diff  Sales_Diff  Reason Down  
    A   -10   -10    11    12  Cost (-10) 
    B   11   -10   -10    11  We're Up 
    C   -12   10    10    -11  Sales (-11) 
    D   -11   -11   -10    -12  Cost (-11), Price (-11), Sales (-12) 
+0

也許用'max.col'下回考慮做一個不太複雜的例子(如,沒有「轉」點「成本」等) – Frank

回答

1

我無法完全理解您想如何構建if語句,但以下內容可以基於上一列中的信息添加新列。

Source <- c("A", "B", "C", "D", "E") 
Rev_Diff <- c(-10, 11, 12, 11, 10) 
Cost_Diff <- c(10, -10, 10, -11, 11) 
Price_Diff <- c(-11, 10, -10, 10, 10) 
Sales_Diff <- c(12, 11, 11, -12, 11) 

df <- data.frame(Source, Rev_Diff, Cost_Diff, Price_Diff, Sales_Diff) 

df %>% 
    mutate(ReasonDown = ifelse(Rev_Diff < 0, paste("Rev", Rev_Diff), 
         ifelse(Cost_Diff < 0, paste("Cost", Cost_Diff), 
         ifelse(Price_Diff < 0, paste("Price", Price_Diff), 
         ifelse(Sales_Diff < 0, paste("Sales", Sales_Diff), "We're up"))))) 

    Source Rev_Diff Cost_Diff Price_Diff Sales_Diff ReasonDown 
1  A  -10  10  -11   12 Rev -10 
2  B  11  -10   10   11 Cost -10 
3  C  12  10  -10   11 Price -10 
4  D  11  -11   10  -12 Cost -11 
5  E  10  11   10   11 We're up 

然而,ifelse將停止一旦找到一個真實的陳述,所以這不會是能夠打印出多個「下來的原因」就像你在源D.有如果你真的想要打印的一切,我覺得您應該可以添加4個新列以檢查Rev,Cost,Price,Sales中的每個列,並添加第5列來總結所有內容。

df %>% 
    mutate(RRev = ifelse(Rev_Diff < 0, paste("Rev", Rev_Diff), "")) %>% 
    mutate(RCost = ifelse(Cost_Diff < 0, paste("Cost", Cost_Diff), "")) %>% 
    mutate(RPrice = ifelse(Price_Diff < 0, paste("Price", Rev_Diff), "")) %>% 
    mutate(RSales = ifelse(Sales_Diff < 0, paste("Sales", Rev_Diff), "")) %>% 
    mutate(DownReason = ifelse(nchar(paste(RRev, RCost, RPrice, RSales)) > 3, paste(RRev, RCost, RPrice, RSales), "We're UP")) 

    Source Rev_Diff Cost_Diff Price_Diff Sales_Diff RRev RCost RPrice RSales   DownReason 
1  A  -10  10  -11   12 Rev -10   Price -10   Rev -10 Price -10 
2  B  11  -10   10   11   Cost -10        Cost -10 
3  C  12  10  -10   11     Price 12     Price 12 
4  D  11  -11   10  -12   Cost -11   Sales 11 Cost -11 Sales 11 
5  E  10  11   10   11            We're UP 
+0

感謝@JPHwang,你會如何添加「我們是最後一節「的最後一個版本? –

+0

您可以使用單個mutate來添加多個列。 – Gregor

+0

@NickKnauer改變了最後的語句來計算字符的數量,如果一切都大於0,粘貼會生成3個空格,所以上面的所有東西都會照常打印,3個空格會生成「我們已經打開」 – JPHwang