当数据不包含到子集的明确组时,子集数据集

时间:2015-09-27 23:06:28

标签: r

您好Stackoverflow社区,

背景 我正在使用人口建模程序,在一系列管理方案的情况下,尝试预测受威胁物种种群的遗传结果。在我的每个人口建模场景结束时,我有一个.csv文件,其中包含所有1000个模拟人口迭代中所有最终生存个体的信息,其中包括所有幸存个体基因型的信息。

我想要的是什么: 从这个.csv输出文件中,我想确定文件中包含的模型的1000次迭代中每列"6""Allele2a"中等位基因"Allele2b"的频率。

问题: 我试图确定等位基因6频率的.csv文件不包含可用于轻松将数据(从可以看到的内容)子集化到单独迭代中的信息。我不知道如何将这个数据集拆分成它的相应迭代,因为存活到模型末尾的个体数量(以及随后每次迭代中单个行的数量)不一样,并且没有明确的子集化点

关于如何将这些数据分成可以分析的迭代单元,或者如何在没有复杂子集的情况下确定等位基因频率的任何指导将非常受欢迎。如果需要任何进一步的信息,请不要犹豫。

谢谢!

编辑:当输入R时,数据如下所示:

            Living<-read.csv("Living Ind.csv", header=F)
            colnames(Living) <- c("Iteration","ID","Pop","Sex","alive","Age","DamID","SireID","F","FInd","MtDNA","Alle1a","Alle1b","Alle2a","Alle2b")
            attach(Living)

            Living
                      Iteration   ID Pop Sex alive Age DamID SireID     F  FInd MtDNA Alle1a Alle1b Alle2a Alle2b
1     Iteration    1  NA        NA  NA    NA     NA    NA    NA    NA     NA     NA     NA     NA
2                 NA  NA        NA  NA    NA     NA    NA    NA    NA     NA     NA     NA     NA
3               2511   2   M  TRUE  19   545   1376 0.000 0.000   545   1089   2751      6      6
4               2515   2   F  TRUE  18   590   1783 0.000 0.000   590   1180   3566      5      5
5               2519   2   F  TRUE  18   717   1681 0.000 0.000   717   1434   3362      4      6
6               2526   2   M  TRUE  17   412   1780 0.000 0.000   412    823   3559      4      6
7               2529   2   F  TRUE  17   324   1473 0.000 0.000   324    647   2945      5      6
107             2676   2   F  TRUE   1  2576   2526 0.000 0.000   621   3876   3559      6      4
108               NA  NA        NA  NA    NA     NA    NA    NA    NA     NA     NA     NA     NA
109   Iteration    2  NA        NA  NA    NA     NA    NA    NA    NA     NA     NA     NA     NA
110               NA  NA        NA  NA    NA     NA    NA    NA    NA     NA     NA     NA     NA
111             2560   2   M  TRUE  18   703   1799 0.000 0.000   703   1406   3598      6      6
112             2564   2   M  TRUE  18   420   1778 0.000 0.000   420    840   3555      4      6
113             2578   2   F  TRUE  17   347   1778 0.000 0.000   347    693   3555      3      5
114             2581   2   M  TRUE  16   330   1454 0.000 0.000   330    659   2907      6      6
115             2584   2   F  TRUE  16   568   1593 0.000 0.000   568   1135   3185      6      5
116             2591   2   F  TRUE  13   318   1423 0.000 0.000   318    635   2846      3      6
117             2593   2   M  TRUE  13   341   1454 0.000 0.000   341    682   2907      6      6
118             2610   2   M  TRUE   8  2578   2582 0.000 0.000   347    693   2908      5      6
119             2612   2   M  TRUE   8  2578   2582 0.000 0.000   347   3555    660      3      6

我害怕这一团糟。

这是指向.csv文件副本的链接。 https://www.dropbox.com/s/pl6ncy5i0152uv1/Living%20Ind.csv?dl=0

1 个答案:

答案 0 :(得分:0)

感谢您提供数据。它使更多更容易。将来你应该总是在SO上提出问题。

基本问题是将原始数据转换为更易于在R中操作的内容。由于您的数据集非常大,我使用data.table包,但您基本上也可以使用基础R中的data.frames同样的事情。

library(data.table)
url <- "https://www.dropbox.com/s/pl6ncy5i0152uv1/Living%20Ind.csv?dl=1"
DT  <- fread(url,header=FALSE, showProgress = FALSE)          # import data
DT  <- DT[!is.na(V2)]                                         # remove blank lines (rows)

brks <- which(DT$V1=="Iteration")                             # identify iteration header rows
iter <- DT[brks,]$V2                                          # extract iteration numbers
DT   <- DT[-brks,Iter:=rep(iter,diff(c(brks,nrow(DT)+1))-1)]  # assign iteration number to each row
DT   <- DT[-brks]                                             # remove iteration header rows
DT[,V1:=NULL]                                                 # remove first column
setnames(DT, c("ID","Pop","Sex","alive","Age","DamID","SireID","F","FInd","MtDNA","Alle1a","Alle1b","Alle2a","Alle2b","Iteration"))

# now can count fraction of allele 6 easily.
DT[,list(frac=sum(Alle2a==6 | Alle2b==6)/.N), by=Iteration]
#       Iteration      frac
#    1:         1 0.7619048
#    2:         2 0.9130435
#    3:         3 0.6091954
#    4:         4 0.8620690
#    5:         5 0.8850575
#   ---                    

如果你要分析这样的大型数据集,那么学习如何使用data.table可能是值得的。