如何向genind添加分层信息

时间:2017-06-07 14:34:27

标签: r

我从包含SNP信息的表中创建了一个genind对象。

我需要将人口信息插入这个genind。

我知道哪些人(通过数字识别)应该进入每个人口。

如何挑选正确的个体并将其置于不同的群体中?

1 个答案:

答案 0 :(得分:1)

在提问时,做一个可重复的例子总是有帮助的。

首先,加载必要的库(非常确定它的adegenet)
library(adegenet)

通过首先获得等位基因载体来制作一些假数据 alleles <- paste0("0",1:4)

设定基因座数,每个群体的个体数和人口数

nloci <- 10
nind <- 10
npops <- 2

使用for循环制作假数据集

i <- NULL
out <- NULL
for(i in 1:npops){
  #there are nind*nloci genotypes in each population
  #make a 
  gts <- replicate(n = nind*nloci,
                   expr = paste0(sample(x = alleles,size = 1,replace = T),
                                 sample(x = alleles,size = 1,replace = T)))
  gts <- as.data.frame(matrix(data = gts,
                              nrow = nind, ncol = nloci, byrow = T))
  #making generic locus colnames()
  colnames(gts) <- paste("locus_",1:nloci)
  out <- rbind(out,gts)
} #end of for loop
head(out)

现在将data.frame转换为genind

obj <- df2genind(out, ploidy=2, ncode=2)
obj

请注意,row.names()被视为个人ID

现在设置人口,请注意它现在是空的

obj@pop 

您只需要一个代表每个人对应人口的向量。

选项1

如果您的个人ID按人口聚集(例如,1-10来自pop1,11-20来自pop2),那么这样的事情应该有效

pops<- paste0("pop",1:npops)

使用该向量设置种群,确保它是一个因子

obj@pop <- as.factor(rep(pops,each=nind))
obj@pop 

选项2

如果包含您的SNP信息的原始data.frame(表格)也包含人口信息,您可以将其用作向量

e.g。如果out看起来像这样

out$pops <- sample(x = pops,size = nrow(out),replace = T)
head(out)

然后可以使用该列作为向量

obj@pop <- as.factor(out$pops)
obj@pop

选项3

或者,如果您有另一个表格,使您能够识别哪些人与哪些人口相对应,那么您可以使用该信息。它假定第二个表(data.frame)与out

的行数相同

这是一个示例第二个表

df <- data.frame(pops = rep(pops,each=nind),
                 id = sample(x = 1:nrow(out),size = nrow(out),replace = F))
head(df)

请注意,这些ID不是有序的,但它们位于out中,因此位于obj中,因此df需要按df$id排序

df <- df[order(df$id),]
head(df)

按照正确的顺序

obj@pop <- as.factor(df$pops)
obj@pop