2017-03-02 81 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