This is a test version of Biostars. For the public version, visit https://www.biostars.org.
Replace symbols in R table

Hello,

I have a table in R which consists of 70k rows and 37 columns. Lot of cells have "./." which I want to modify and make it as "ab" . I tried to use gsub() but it does not give me the required output.

I used :

file <- gsub("./.","ab",file)

I want the change to happen throughout the file. Is there any other way with which I can modify it? Thanks in advance.

Input: Eg:

S.no chr pos gene_name S1 S2 S3
1        1    1290    X            ./.   1/1  ./.
2        1     5822    Y           0/1   ./.   ./.

Output

S.no chr pos gene_name S1 S2 S3
    1        1    1290    X            ab   1/1  ab
    2        1     5822    Y           0/1   ab   ab

It can be either ab or NA

r gsub vcf
> d=rep("./.",5)
> d
[1] "./." "./." "./." "./." "./."
> gsub("./.","ab",d)
[1] "ab" "ab" "ab" "ab" "ab"
> e=data.frame(d)
> e$f=e$d
> e
    d   f
1 ./. ./.
2 ./. ./.
3 ./. ./.
4 ./. ./.
5 ./. ./.
> library(dplyr)
> library(stringr)
> e %>%  mutate_all(funs(str_replace_all(.,"./.","ab")))
   d  f
1 ab ab
2 ab ab
3 ab ab
4 ab ab
5 ab ab

Try with d <- c("./.","./x","x/yy","./.","./.") example, gsub won't work.

that was an example code without all corner cases. For the example code posted above, following would work:

> gsub('\\./\\.',"ab",d)
[1] "ab"   "./x"  "x/yy" "ab"   "ab"

I understand . is a regex for any single character (in general). Since OP hasn't provided any data, I used simple case.

3 answers

Try to use fixed match:

file <- gsub("./.","ab",file, fixed = TRUE)

Or

file[ file == "./." ] <- "ab"

Edit: Using example data provided by OP.

# example input data
df1 <- read.table(text = "
S.no chr pos gene_name S1 S2 S3
1        1    1290    X            ./.   1/1  ./.
2        1     5822    Y           0/1   ./.   ./.", header = TRUE, stringsAsFactors = FALSE)

df1
#   S.no chr  pos gene_name  S1  S2 S3
# 1    1   1 1290         X  ab 1/1 ab
# 2    2   1 5822         Y 0/1  ab ab

df1[, c("S1", "S2", "S3")][ df1[, c("S1", "S2", "S3")] == "./." ] <- "ab"
df1
#   S.no chr  pos gene_name  S1  S2 S3
# 1    1   1 1290         X  ab 1/1 ab
# 2    2   1 5822         Y 0/1  ab ab

Thanks for your answer. The second one worked but it does not show "ab" instead it is blank and has "NA"s

Provide reproducible example input data, and expected output.

I have edited my question with an example input and output. Thanks

Edited my answer, see if it works.

df1=read.csv("test.txt", header = T, strip.white = T, stringsAsFactors = F, sep = "\t")
library(stringr)
library(dplyr)
> df1 %>%  mutate_all(funs(str_replace_all(.,"\\.[/|\\|]\\.","ab")))
  S.no chr  pos gene_name  S1  S2 S3
1    1   1 1290         X  ab 1/1 ab
2    2   1 5822         Y 0/1  ab ab

You can also use apply function:

> library(stringr)
> apply(df1,2, function(x) str_replace_all(x,"\\.[/|\\|]\\.","ab"))
     S.no chr pos    gene_name S1    S2    S3  
[1,] "1"  "1" "1290" "X"       "ab"  "1/1" "ab"
[2,] "2"  "1" "5822" "Y"       "0/1" "ab"  "ab"

This is supposed to replace both ./. and .|.. test.txt is OP input text.

I want only the ./. to be modified not the 1/1.

oops..typo. It doesn't replace any character other than . (./. or .|.). Edited OP. Inquisitive8995

Moved your post to an answer, you might want to clean up your above comments, or edit them in into this post.

df[df=="./."] = "ab" will do the job, where df is the dataframe of your data

How is this different from my answer?

Sorry, somehow missed your solution! Deleting

Log in to answer this question.