CalvinWong
CalvinWong

Reputation: 25

How to iterate over multiple vectors

Fairly new to R. Been working on this for a while but can't seem to get it working. I am trying to create a column called peo$Tier. It has 3 levels, ("1", "2", "3")

tier1 <- c("ADP TOTAL SOURCE INC", "A 1 HR A DIVISION OF OASIS OUTSOURCING INC", "COADVANTAGE CORP", "INSPERITY INC", "OASIS ACQUISITION INC", "OASIS ACQUISITION INC A PAYCHEX CO", "OASIS DHR LLC", "OASIS OUTSOURCING CONTRACT II INC", "OASIS OUTSOURCING INC", "PAYCHEX BUSINESS SOLUTIONS LLC", "PAYCHEX HR OUTSOURCING LLC", "TRINET GROUP INC", "TRINET HR II HOLDINGS INC", "TRINET HR IV LLC")
tier2 <- c("ALLY HR LLC DBA MATRIXONESOURCE", "ALPHASTAFF GROUP INC", "CHOICE EMPLOYER SOLUTIONS INC", "CORNERSTONE CAPITAL GROUP INC", "DECISION HR", "FLORIDA RESOURCE MANAGEMENT LLC", "FRANKCRUM 2 INC", "IMPACT STAFF LEASING LLC", "JUSTWORKS EMPLOYMENT GROUP LLC", "KYMBERLY GROUP PAYROLL SOLUTIONS INC", "OCMI III INC DBA PEOPAYGO", "REGIS GROUP HOLDINGS INC", "SOUTH EAST PERSONNEL LEASING INC", "STAFFLINK OUTSOURCING INC", "THE S2 HR GROUP LLC", "TLR OF BONITA INC", "WORKFORCE BUSINESS SERVICES INC")

If peo$Tier variable is in vector tier1, "1" will be assigned. If peo$Tier variable is in vector tier2, "2" will be assigned. Else "3" will be assigned. These vector values come from another column called peo$NAMED.INSURED and there is a total of 208 unique character.

I tried subsetting but it only worked for the first value within the vector. I tried a for loop but getting the error:

longer object length is not a multiple of shorter object length

Not sure how to accomplish this task. Please help.

for (i in 1:length(peo$NAMED.INSURED)) {
    peo$Tier[i] <- ifelse(peo$NAMED.INSURED == tier1, 1, ifelse(peo$NAMED.INSURED == tier2, 2, 3))
}

Upvotes: 0

Views: 86

Answers (2)

akrun
akrun

Reputation: 886938

We can also use arithmetic to recode the values

peo$Tier <- with(peo,  as.integer(factor(1 +  2* NAMED.INSURED %in% tier1 +
          4 * NAMED.INSURED %in% tier2)))

Upvotes: 0

Ronak Shah
Ronak Shah

Reputation: 388797

ifelse is vectorised and when you are comparing more than one value use %in% and not ==.

So in this case you can do

peo$Tier <- with(peo, ifelse(NAMED.INSURED %in% tier1, 1, 
                      ifelse(NAMED.INSURED %in% tier2, 2, 3)))

We can also use case_when from dplyr

library(dplyr)
peo %>%
 mutate(Tier = case_when(NAMED.INSURED %in% tier1 ~ 1, 
                         NAMED.INSURED %in% tier2 ~ 2, 
                         TRUE ~3))

Upvotes: 1

Related Questions