2
$\begingroup$

I am currently asking myself how to rename samples in a vcf file. This is necessary, because the naming of several samples included in thr vcf file was unfortunately not be chosen by me.

I am loading the vcf file via readVcf() from the VariantAnnotation package in R.

To check the sample names, I can use samples(header(vcf.file)), which will give me the names as characters.

It looks like this:

enter image description here

and so on..

(I am actually very sorry that I cannot give a reproducible example here :( )

I also have a vector with all the new names. For example

new.names <- c("1","2","3","4")

I tried to exchange the "old names" with the new.names vector:

samples(header(vcf.file)) <- new.names

which leads to the error

Error in samples(header(data.vcf)) <- names.sample : 
  could not find function "samples<-" 

I also tried to use the rutilstimflutre package, which has a already designed function for this, but unfortunately the package is outdated and not available for the newest R version.

Is there a way to do this? Perhaps a better way to assign the new names to the old ones?

Thanks a lot.

$\endgroup$

3 Answers 3

4
$\begingroup$

Easiest to use bcftools, if samples.txt has the new sample names:

bcftools reheader -s samples.txt -o new.bcf old.bcf
$\endgroup$
2
  • 1
    $\begingroup$ Thank you, since i only have a brief knowledge of R, is there an R solution? $\endgroup$
    – CoDa
    Commented Jun 9, 2021 at 14:23
  • 1
    $\begingroup$ Maybe - I'm not sure. This approach doesn't require any knowledge of any programming - just doing this should work perfectly. Generally I prefer not to use R for working with .vcfs because it's slow to load them into memory. If you are working with .vcfs I would highly recommend getting familiar with bcftools as it is very fast and memory efficient. $\endgroup$
    – user438383
    Commented Jun 9, 2021 at 14:26
4
$\begingroup$

This proved to be so simple that it took a while to discover: Just use colnames.

x = readVcf("in.vcf")
colnames(x) <- c("new1", "new2")
# At this point, colnames(x) and samples(header(x)) will show different names

# ... but if you write it out, it should use the colnames for both:
writeVcf(x, "out.vcf")
y = readVcf("out.vcf")

# samples(header(y)) and colnames(y) should both be "new1","new2" here
$\endgroup$
1
  • $\begingroup$ Thank you for posting a solution in R. $\endgroup$
    – Ram RS
    Commented Jun 16, 2023 at 14:12
0
$\begingroup$

Here is an example in python how to rename samples using pyvcf submodule I wrote:

>>> from fuc import pyvcf
>>> data = {
...     'CHROM': ['chr1', 'chr2'],
...     'POS': [100, 101],
...     'ID': ['.', '.'],
...     'REF': ['G', 'T'],
...     'ALT': ['A', 'C'],
...     'QUAL': ['.', '.'],
...     'FILTER': ['.', '.'],
...     'INFO': ['.', '.'],
...     'FORMAT': ['GT', 'GT'],
...     'Steven': ['0/1', '1/1'],
...     'Sara': ['0/0', '0/1'],
... }
>>> vf = pyvcf.VcfFrame.from_dict([], data)
>>> # vf = pyvcf.VcfFrame.from_file('your_file.vcf')
>>> vf.df
  CHROM  POS ID REF ALT QUAL FILTER INFO FORMAT Steven Sara
0  chr1  100  .   G   A    .      .    .     GT    0/1  0/0
1  chr2  101  .   T   C    .      .    .     GT    1/1  0/1
>>> vf.df = vf.df.rename(columns={'Steven': 'John', 'Sara': 'Rachel'})
>>> vf.df
  CHROM  POS ID REF ALT QUAL FILTER INFO FORMAT John Rachel
0  chr1  100  .   G   A    .      .    .     GT  0/1    0/0
1  chr2  101  .   T   C    .      .    .     GT  1/1    0/1
>>> # vf.to_file('renamed.vcf')
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.