Встроенное заявление 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", если"Cost_Diff"с суммой меньше 0, выведите"Price", если"Price_Diff"с суммой меньше 0, выведите"Sales", если"Sales_Diff"с суммой меньше чем 0, иначе выведите "Мы на связи".
Окончательный результат:
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)
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