Search code examples
rif-statementconditional-statementsrecode

How do I pull the values from multiple columns, conditionally, into a new column?


I am a relatively novice R user, though familiar with dplyr and tidy verse. I still can't seem to figure out how to pull in the actual data from one column if it meets certain condition, into a new column.

Here is what I'm trying to do. Participants have ranked specific practices (n=5) and provided responses to questions that represent their beliefs about these practices. I want to have five new columns that assign their beliefs about the practices to their ranks, rather than the practices.

For example, they have a score for "beliefs about NI" called ni.beliefs, if a participant ranked NI as their first choice, I want the value for ni.beliefs to be pulled into the new column for first.beliefs. The same is true that if a participant put pmii as their first choice practice, their value for pmii.beliefs should be pulled into the first.beliefs column.

So, I need five new columns called: first.beliefs, second.beliefs, third.beliefs, fourth.beliefs, last.beliefs and then I need each of these to have the data pulled in conditionally from the practice specific beliefs (ni.beliefs, dtt.beliefs, pmi.beliefs, sn.beliefs, script.beliefs) dependent on the practice specific ranks (rank assigned of 1-5 for each practice, rank.ni, rank.dtt, rank.pmi, rank.sn, rank.script).

Here is what I have so far but I am stuck and aware that this is not very close. Any help is appreciated!!!

`

Diss$first.beliefs <-ifelse(rank.ni==1, ni.beliefs,
                    ifelse(rank.dtt==1, dtt.beliefs,
                           ifelse(rank.pmi==1, pmi.beliefs,
                                  ifelse(rank.sn, sn.beliefs,
                                         ifelse(rank.script==1, script.beliefs)))))

`

Thank you!!


Solution

  • This is done very easily with the case_when() function. You can improve on the code below.

    library(dplyr)
    
    Diss$first.beliefs <- case_when(
      rank.ni == 1 ~ ni.beliefs,
      rank.dtt == 1 ~ dtt.beliefs,
      rank.pmi == 1 ~ pmi.beliefs,
      rank.sn ~ sn.beliefs,
      rank.script == 1 ~ script.beliefs
    )