答案 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
您只需要一个代表每个人对应人口的向量。
如果您的个人ID按人口聚集(例如,1-10来自pop1,11-20来自pop2),那么这样的事情应该有效
pops<- paste0("pop",1:npops)
使用该向量设置种群,确保它是一个因子
obj@pop <- as.factor(rep(pops,each=nind))
obj@pop
如果包含您的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
或者,如果您有另一个表格,使您能够识别哪些人与哪些人口相对应,那么您可以使用该信息。它假定第二个表(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
排序{ p>
df <- df[order(df$id),]
head(df)
按照正确的顺序
obj@pop <- as.factor(df$pops)
obj@pop