How to replace number in R
1
1
Entering edit mode
6.0 years ago
Kian ▴ 50

How I can replace number in R 1 to11, 2 to 22 and 0 to 10, also -9 as NA?

         id        rs143        rs148       rs149      rs1490 
 1    02003s         -9          1          2          1    
 2    02003s         -9          0          1          2  
 3    02003s         -9          1          1          2   
 4    02003s         -9          0          1          1
 5    02003s         -9          0          1          1

I want to replace numbers as this format:

         id        rs143        rs148       rs149      rs1490 
 1    02003s         NA          11          22          11    
 2    02003s         NA          10          11          22   
 3    02003s         NA          11          11          22
 4    02003s         NA          10          11          11 
 5    02003s         NA          10          11          11

I tried this

  df[df==1]<-11
  df[df==2]<-22
  df[df==0]<-10

But this error occur:

 In [<-.factor`(`*tmp*`, thisvar, value = 22) :
 invalid factor level, NA generated
R replace number • 9.2k views
ADD COMMENT
0
Entering edit mode

check str of dataframe. I guess some of them are factors instead of integers.

ADD REPLY
0
Entering edit mode

As per cpad0112

Also, this must be connected to your other thread: Separate one column in two column R

ADD REPLY
0
Entering edit mode

Thank you cpda0112 and Dear Kevin for responses, how i can solve this problem!

ADD REPLY
0
Entering edit mode

can you paste output from str(head(df)), here?

ADD REPLY
0
Entering edit mode
help(as.numeric)
ADD REPLY
6
Entering edit mode
6.0 years ago
zx8754 11k

As mentioned in the comments some of the columns are class of factor, not numeric. If all SNP columns are numeric, then your existing code should work.

Try below code to convert, factor and numeric columns into numeric:

# lookup for allele recoding
lookup <- setNames(c(NA, 10, 11, 22), c(-9, 0, 1, 2))


res <- cbind(df[, 1, drop = FALSE], 
             data.frame(lapply(df[, -1], function(i) lookup[ as.character(i) ])))

res
#       id rs143 rs148 rs149 rs1490
# 1 02003s    NA    11    22     11
# 2 02003s    NA    10    11     22
# 3 02003s    NA    11    11     22
# 4 02003s    NA    10    11     11
# 5 02003s    NA    10    11     11
ADD COMMENT
0
Entering edit mode

Thank you zx8754, its RIGHT!

ADD REPLY

Login before adding your answer.

Traffic: 2537 users visited in the last hour
Help About
FAQ
Access RSS
API
Stats

Use of this site constitutes acceptance of our User Agreement and Privacy Policy.

Powered by the version 2.3.6