Respondents to a survey (rows) will give a colour as an answer in one of four columns. The other three columns have the value “none”. I am trying to create a new column that picks up the colour that’s in one of those columns
example dataframe
<code>am1 <- c('blue', 'blue', 'none', 'none', 'none', 'none', 'blue', 'none')
am2 <- c('none', 'none', 'red', 'none','none', 'red', 'none', 'none')
am3 <- c('none', 'none', 'none', 'purple', 'purple', 'none', 'none', 'none')
am4 <- c('none', 'none', 'none', 'none', 'none', 'none', 'none', 'green')
mydata <- data.frame(am1, am2, am3, am4)
</code>
<code>am1 <- c('blue', 'blue', 'none', 'none', 'none', 'none', 'blue', 'none')
am2 <- c('none', 'none', 'red', 'none','none', 'red', 'none', 'none')
am3 <- c('none', 'none', 'none', 'purple', 'purple', 'none', 'none', 'none')
am4 <- c('none', 'none', 'none', 'none', 'none', 'none', 'none', 'green')
mydata <- data.frame(am1, am2, am3, am4)
</code>
am1 <- c('blue', 'blue', 'none', 'none', 'none', 'none', 'blue', 'none')
am2 <- c('none', 'none', 'red', 'none','none', 'red', 'none', 'none')
am3 <- c('none', 'none', 'none', 'purple', 'purple', 'none', 'none', 'none')
am4 <- c('none', 'none', 'none', 'none', 'none', 'none', 'none', 'green')
mydata <- data.frame(am1, am2, am3, am4)
my attempt to use case_when
<code>mydata1 <- mydata %>%mutate(chosen_colour =
case_when(
str_detect(am1, "none") ~ am2,
str_detect(am1, "none") & str_detect(am2, "none") ~ am3,
str_detect(am1, "none") & str_detect(am2, "none") & str_detect(am3, "none") ~ am4,
TRUE ~ am1
</code>
<code>mydata1 <- mydata %>%mutate(chosen_colour =
case_when(
str_detect(am1, "none") ~ am2,
str_detect(am1, "none") & str_detect(am2, "none") ~ am3,
str_detect(am1, "none") & str_detect(am2, "none") & str_detect(am3, "none") ~ am4,
TRUE ~ am1
</code>
mydata1 <- mydata %>%mutate(chosen_colour =
case_when(
str_detect(am1, "none") ~ am2,
str_detect(am1, "none") & str_detect(am2, "none") ~ am3,
str_detect(am1, "none") & str_detect(am2, "none") & str_detect(am3, "none") ~ am4,
TRUE ~ am1
does not work when using & operator – as the chosen_colour should always have a colour as a value
am1 | am2 | am3 | am4 | chosen_colour |
---|---|---|---|---|
blue | none | none | none | blue |
blue | none | none | none | blue |
none | red | none | none | red |
none | none | purple | none | none |
none | none | purple | none | none |
none | red | none | none | none |
blue | none | none | none | blue |
none | none | none | green | none |
If there is exactly one chosen colour you could use apply with setdiff:
<code>mydata$chosen_colour <- apply(mydata, 1, (x) setdiff(x, "none"))
</code>
<code>mydata$chosen_colour <- apply(mydata, 1, (x) setdiff(x, "none"))
</code>
mydata$chosen_colour <- apply(mydata, 1, (x) setdiff(x, "none"))
With dplyr and case_when:
<code>library(dplyr)
mydata1 <- mydata %>%
mutate(
chosen_colour = case_when(
am1 != "none" ~ am1,
am2 != "none" ~ am2,
am3 != "none" ~ am3,
TRUE ~ am4
)
)
</code>
<code>library(dplyr)
mydata1 <- mydata %>%
mutate(
chosen_colour = case_when(
am1 != "none" ~ am1,
am2 != "none" ~ am2,
am3 != "none" ~ am3,
TRUE ~ am4
)
)
</code>
library(dplyr)
mydata1 <- mydata %>%
mutate(
chosen_colour = case_when(
am1 != "none" ~ am1,
am2 != "none" ~ am2,
am3 != "none" ~ am3,
TRUE ~ am4
)
)