1

I want to switch column B and C conditional on column ID; only switch when ID = N. My following code works, but is there a simpler/intuitive method?

df
ID   A   B   C
Y    4   2   4
Y    1   5   7
N    8   3   NaN
N    6   2   NaN

Expected df
ID   A   B   C
Y    4   2   4
Y    1   5   7
N    8   NaN 3  
N    6   NaN 2  
df$Bnew <- ifelse(df$ID== "N", df$C, df$B)
df$Cnew <- ifelse(df$ID== "N", df$B, df$C)
drops <- c("B", "C")
df <- df[, !names(df) %in% drops]
colnames(df)[colnames(df) == "Bnew"] <- "B"
colnames(df)[colnames(df) == "Cnew"] <- "C"
M--
  • 25,431
  • 8
  • 61
  • 93
Lumos
  • 1,303
  • 2
  • 17
  • 32

1 Answers1

3

Just switch the columns when the condition is met.

df[df$ID == "N", c("B", "C")] <- df[df$ID == "N", c("C", "B")]
M--
  • 25,431
  • 8
  • 61
  • 93