создание условного столбца на основе нескольких критериев столбца (R) - PullRequest
0 голосов
/ 01 июня 2018
TowQty <- c(2,3,4,5,9,0,0,0,4);
SvcQty<- c(4,8,3,4,2,0,,4,0,2);
Acc.AvgTowInv<- c(20,25,65,45,67,0,0,0,76);
Acc.AvgSvcInv<-c(25,32,45,53,23,0,26,0,43)

data.frame <- data.frame(TowQty , SvcQty, Acc.AvgTowInv, Acc.AvgSvcInv, stringsAsFactors=FALSE)

?Создание нового столбца Conditional_Column на основе указанных ниже критериев)

когда (TowQty> 0 и SvcQty> 0) затем (((1 - ((Acc.AvgTowInv - 50.0) / 50.0)) * 40) + ((1 -((Acc.AvgSvcInv - 25,0) / 25,0)) * 40)) / 2
когда (TowQty> 0 и SvcQty = 0) тогда ((1 - ((Acc.AvgTowInv - 50,0) / 50,0)) * 40)
когда (TowQty = 0 и SvcQty> 0) тогда ((1 - ((Acc.AvgSvcInv - 25.0) / 25.0)) * 40)
когда (TowQty = 0 и SvcQty = 0) тогда 0

Хотелось бы найти решение на языке программирования R.Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Вместо использования вложенного ifelse, вы можете использовать dplyr::case_when().

require(tidyverse)

TowQty <- c(2,3,4,5,9,0,0,0,4)
SvcQty<- c(4,8,3,4,2,0,4,0,2)
Acc.AvgTowInv<- c(20,25,65,45,67,0,0,0,76)
Acc.AvgSvcInv<-c(25,32,45,53,23,0,26,0,43)

data.frame <- data.frame(TowQty , SvcQty, Acc.AvgTowInv, 
                         Acc.AvgSvcInv, stringsAsFactors=FALSE)

data.frame %>% 
  mutate(newCalc = case_when(
    #Con. 1.
    TowQty > 0 & SvcQty > 0  ~ 
      (((1 - ((Acc.AvgTowInv - 50) / 50)) * 40) +
         ((1 - ((Acc.AvgSvcInv - 25) / 25.0)) * 40)) / 2, 
    #Con. 2
    TowQty > 0 & SvcQty == 0 ~ 
      (1 - ((Acc.AvgTowInv - 50) / 50)) * 40, 
    #Con. 3
    TowQty == 0 & SvcQty > 0 ~ (1 - ((Acc.AvgSvcInv - 25) / 25)) * 40, 
    #Con. 4 
    TowQty == 0 & SvcQty == 0 ~ 0 ))
0 голосов
/ 01 июня 2018

Вы можете написать серию операторов ifelse следующим образом:

a <- c(1,2,0,0)
b <- c(3,0,2,0)
c <- c(0,10,11,12)
d <- c(0,11,12,13)

data.frame <- data.frame(a , b, c, d, stringsAsFactors=FALSE)

data.frame$nc <- with(data.frame, 
                  ifelse(a > 0 & b >0, c+3, 
                         ifelse(a > 0 & b==0, c+4,
                                ifelse(a==0 & b>0, c+5,
                                       ifelse(a==0 & b==0, 0, 0))))) 

data.frame

  a b  c  d nc
1 1 3  0  0  3
2 2 0 10 11 14
3 0 2 11 12 16
4 0 0 12 13  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...