Create new column based on 4 values in another column

后端 未结 4 710
生来不讨喜
生来不讨喜 2020-12-05 02:25

I want to create a new column based on 4 values in another column.

if col1=1 then col2= G;
if col1=2 then col2=H;
if col1=3 then col2=J;
if col1=4 then col2=         


        
相关标签:
4条回答
  • 2020-12-05 02:48

    There are a number of ways of doing this, but here's one.

    set.seed(357)
    mydf <- data.frame(col1 = sample(1:4, 10, replace = TRUE))
    mydf$col2 <- rep(NA, nrow(mydf))
    mydf[mydf$col1 == 1, ][, "col2"] <- "A"
    mydf[mydf$col1 == 2, ][, "col2"] <- "B"
    mydf[mydf$col1 == 3, ][, "col2"] <- "C"
    mydf[mydf$col1 == 4, ][, "col2"] <- "D"
    
       col1 col2
    1     1    A
    2     1    A
    3     2    B
    4     1    A
    5     3    C
    6     2    B
    7     4    D
    8     3    C
    9     4    D
    10    4    D
    

    Here's one using car's recode.

    library(car)
    mydf$col3 <- recode(mydf$col1, "1" = 'A', "2" = 'B', "3" = 'C', "4" = 'D')
    

    One more from this question:

    mydf$col4 <- c("A", "B", "C", "D")[mydf$col1]
    
    0 讨论(0)
  • 2020-12-05 03:00

    You have a special case of looking up values where the index are integer numbers 1:4. This means you can use vector indexing to solve your problem in one easy step.

    First, create some sample data:

    set.seed(1)
    dat <- data.frame(col1 = sample(1:4, 10, replace = TRUE))
    

    Next, define the lookup values, and use [ subsetting to find the desired results:

    values <- c("G", "H", "J", "K")
    dat$col2 <- values[dat$col1]
    

    The results:

    dat
       col1 col2
    1     2    H
    2     2    H
    3     3    J
    4     4    K
    5     1    G
    6     4    K
    7     4    K
    8     3    J
    9     3    J
    10    1    G
    

    More generally, you can use [ subsetting combined with match to solve this kind of problem:

    index <- c(1, 2, 3, 4)
    values <- c("G", "H", "J", "K")
    dat$col2 <- values[match(dat$col1, index)]
    dat
       col1 col2
    1     2    H
    2     2    H
    3     3    J
    4     4    K
    5     1    G
    6     4    K
    7     4    K
    8     3    J
    9     3    J
    10    1    G
    
    0 讨论(0)
  • 2020-12-05 03:02

    You could have a look at ?symnum.

    In your case, something like:

    col2<-symnum(col1, seq(0.5, 4.5, by=1), symbols=c("G", "H", "J", "K"))
    

    should get you close.

    0 讨论(0)
  • You could use nested ifelse:

    col2 <- ifelse(col1==1, "G",
            ifelse(col1==2, "H",
            ifelse(col1==3, "J",
            ifelse(col1==4, "K",
                            NA  )))) # all other values map to NA
    

    In this simple case it's overkill, but for more complicated ones...

    0 讨论(0)
提交回复
热议问题