how to assign half of the vector in r

257 Views Asked by At

Because i am dealing with a survey, there is no difference when df$vec3==3 and I want to assign when vec3==3, 1 and 2

vec1 <- c("1","2","3","4","5","6")
vec2 <- c("a","s","d","f","g","h")
vec3 <- c("1","2","3","3","3","3")

df <- cbind(vec1,vec2,vec3)
df

     vec1 vec2 vec3
[1,] "1"  "a"  "1" 
[2,] "2"  "s"  "2" 
[3,] "3"  "d"  "3" 
[4,] "4"  "f"  "3" 
[5,] "5"  "g"  "3" 
[6,] "6"  "h"  "3" 

Expected answer

   vec1 vec2 vec3 vec4
[1,] "1"  "a"  "1"  "1"
[2,] "2"  "s"  "2"  "2"
[3,] "3"  "d"  "3"  "1" 
[4,] "4"  "f"  "3"  "2" 
[5,] "5"  "g"  "3"  "1"
[6,] "6"  "h"  "3"  "2"
1

There are 1 best solutions below

0
Ronak Shah On BEST ANSWER

We can use ifelse and repeat 1:2 for number of times we have vec3 == 3.

transform(df, vec4 = ifelse(vec3 == 3,rep(1:2,length.out = sum(vec3 == 3)), vec3))

#  vec1 vec2 vec3 vec4
#1    1    a    1    1
#2    2    s    2    2
#3    3    d    3    1
#4    4    f    3    2
#5    5    g    3    1
#6    6    h    3    2

Or using dplyr :

library(dplyr)
df %>%
  mutate(vec4 = ifelse(vec3 == 3, rep(1:2,length.out = sum(vec3 == 3)), vec3))

Or a simpler approach using vector recycling.

df$vec4 <- df$vec3
df$vec4[df$vec4 == 3] <- 1:2

data

df <- data.frame(vec1,vec2,vec3, stringsAsFactors = FALSE)