我有一个等位基因同一性的数据表(行是个体,列是基因座),由单独的列分组。我想按组有效地计算每个位点的等位基因频率(比例)。数据表示例:
DT = data.table(Loc1=rep(c("G","T"),each=5),
Loc2=c("C","A"), Loc3=c("C","G","G","G",
"C","G","G","G","G","G"),
Group=c(rep("G1",3),rep("G2",4),rep("G3",3)))
for(i in 1:3)
set(DT, sample(10,2), i, NA)
> DT
Loc1 Loc2 Loc3 Group
1: G NA C G1
2: G A G G1
3: G C G G1
4: NA NA NA G2
5: G C NA G2
6: T A G G2
7: T C G G2
8: T A G G3
9: T C G G3
10: NA A G G3
我遇到的问题是,当我尝试按组进行计算时,只有组中存在的等位基因ID被识别,所以我很难找到可以告诉我的代码,例如,所有3组中位点1的G比例。简单示例,计算每个位点处第一个等位基因的总和(不是比例):
> fun1<- function(x){sum(na.omit(x==unique(na.omit(x))[1]))}
> DT[,lapply(.SD,fun1),by=Group,.SDcols=1:3]
Group Loc1 Loc2 Loc3
1: G1 3 1 1
2: G2 1 2 2
3: G3 2 2 3
对于G1,结果是Loc1有3个G,但是对于G3,它显示Loc1有2个T,而不是G的数量。在这种情况下,我想要两者的G的数量。所以关键问题是等位基因身份是由组决定的,而不是整个列。我试着用我想在计算中使用的等位基因身份制作一个单独的表格,但是不知道如何将它包含在fun1中,以便在上面的应用程序中引用正确的单元格。等位基因身份表:
> fun2<- function(x){sort(na.omit(unique(x)))}
> allele.id<-data.table(DT[,lapply(.SD,fun2),.SDcols=1:3])
> allele.id
Loc1 Loc2 Loc3
1: G A C
2: T C G
这是使用< code>table的另一个选项。(我不确定预期输出的格式。此外,我们是否需要在计算比例时包括< code>NA元素也不清楚。如果我们不需要它,我们可以删除< code>useNA=...。)
我们遍历"Loc"列,用"Group"创建该列的table
,使用prop.table
(指定边距
)获取比例,并将结果存储在list
('lst')中。
nm1 <- paste0('Loc', 1:3)
lst <- vector('list' , length(nm1))
for(i in seq_along(nm1)){
temp <- table(DT$Group, DT[[i]], useNA= 'ifany')
lst[[i]] <- list(temp, prop.table(temp, 1))
}
lst[[1]]
#[[1]]
#
# G T <NA>
# G1 3 0 0
# G2 1 2 1
# G3 0 2 1
#[[2]]
#
# G T <NA>
# G1 1.0000000 0.0000000 0.0000000
# G2 0.2500000 0.5000000 0.2500000
# G3 0.0000000 0.6666667 0.3333333
转换数据可能是明智的。首先将表格转换为长格式。这将使其更易于用于进一步计算(例如,使用<code>ggplot2数据的熔化
功能。表
(其工作原理与<code>整形2
DT2 <- melt(DT, id = "Group", variable.name = "loci")
当您想在熔化操作期间删除
NA
-值时,您可以在上面的调用中添加na.rm=TRUE
(na.rm=FALSE
是默认行为)。
然后,您可以按如下方式创建计数和比例变量:
DT2 <- DT2[, .N, by = .(Group, loci, value)][, prop := N/sum(N), by = .(Group, loci)]
这给出了以下结果:
> DT2
Group loci value N prop
1: G1 Loc1 G 3 1.0000000
2: G2 Loc1 NA 1 0.2500000
3: G2 Loc1 G 1 0.2500000
4: G2 Loc1 T 2 0.5000000
5: G3 Loc1 T 2 0.6666667
6: G3 Loc1 NA 1 0.3333333
7: G1 Loc2 NA 1 0.3333333
8: G1 Loc2 A 1 0.3333333
9: G1 Loc2 C 1 0.3333333
10: G2 Loc2 NA 1 0.2500000
11: G2 Loc2 C 2 0.5000000
12: G2 Loc2 A 1 0.2500000
13: G3 Loc2 A 2 0.6666667
14: G3 Loc2 C 1 0.3333333
15: G1 Loc3 C 1 0.3333333
16: G1 Loc3 G 2 0.6666667
17: G2 Loc3 NA 2 0.5000000
18: G2 Loc3 G 2 0.5000000
19: G3 Loc3 G 3 1.0000000
我希望它以宽格式返回,您可以在多个变量上使用
dcast
:
DT3 <- dcast(DT2, Group + loci ~ value, value.var = c("N", "prop"), fill = 0)
这导致:
> DT3
Group loci N_A N_C N_G N_T N_NA prop_A prop_C prop_G prop_T prop_NA
1: G1 Loc1 0 0 3 0 0 0.0000000 0.0000000 1.0000000 0.0000000 0.0000000
2: G1 Loc2 1 1 0 0 1 0.3333333 0.3333333 0.0000000 0.0000000 0.3333333
3: G1 Loc3 0 1 2 0 0 0.0000000 0.3333333 0.6666667 0.0000000 0.0000000
4: G2 Loc1 0 0 1 2 1 0.0000000 0.0000000 0.2500000 0.5000000 0.2500000
5: G2 Loc2 1 2 0 0 1 0.2500000 0.5000000 0.0000000 0.0000000 0.2500000
6: G2 Loc3 0 0 2 0 2 0.0000000 0.0000000 0.5000000 0.0000000 0.5000000
7: G3 Loc1 0 0 0 2 1 0.0000000 0.0000000 0.0000000 0.6666667 0.3333333
8: G3 Loc2 2 1 0 0 0 0.6666667 0.3333333 0.0000000 0.0000000 0.0000000
9: G3 Loc3 0 0 3 0 0 0.0000000 0.0000000 1.0000000 0.0000000 0.0000000
另一种直接的方法是在一次调用中使用< code>melt
和< code>dcast(这是@Frank回答的第一部分的简化版本):
DT2 <- dcast(melt(DT, id="Group"), Group + variable ~ value)
这给出了:
> DT2
Group variable A C G T NA
1: G1 Loc1 0 0 3 0 0
2: G1 Loc2 1 1 0 0 1
3: G1 Loc3 0 1 2 0 0
4: G2 Loc1 0 0 1 2 1
5: G2 Loc2 1 2 0 0 1
6: G2 Loc3 0 0 2 0 2
7: G3 Loc1 0 0 0 2 1
8: G3 Loc2 2 1 0 0 0
9: G3 Loc3 0 0 3 0 0
由于dcast
中的默认聚合函数是length
,您将自动获得每个值的计数。
使用的数据:
DT <- structure(list(Loc1 = c("G", "G", "G", NA, "G", "T", "T", "T", "T", NA),
Loc2 = c(NA, "A", "C", NA, "C", "A", "C", "A", "C", "A"),
Loc3 = c("C", "G", "G", NA, NA, "G", "G", "G", "G", "G"),
Group = c("G1", "G1", "G1", "G2", "G2", "G2", "G2", "G3", "G3", "G3")),
.Names = c("Loc1", "Loc2", "Loc3", "Group"), row.names = c(NA, -10L), class = c("data.table", "data.frame"))
问题内容: 我有一个3列和数千行的表,前2列有数据。第三列当前为空,我需要根据第一列和第二列中已有的数据填充第三列。 假设我在第一栏中有状态,在第二栏中有水果条目。我需要编写一条SQL语句来计算 每种水果来自的不同状态数 ,然后将此流行度数字插入到每一行的第三列中。该行中的受欢迎程度数字1表示水果仅来自一个州,受欢迎程度数字4表示该水果来自4个州。所以我的桌子目前是这样的: 我需要弄清楚如何计算然
问题内容: 我想计算一个文本文件中所有单词的频率。 如果目标文本文件如下所示,则应返回: 在一些帖子之后,我已经用纯python实现了它。但是,我发现由于巨大的文件大小(> 1GB),纯python方法是不够的。 我认为借用sklearn的能力是一个候选人。 如果让CountVectorizer为每一行计数频率,我想您将通过累加每一列来获得字频率。但是,这听起来有点间接。 用python计算文件中
使用 分配给多个列的最佳方法是什么?例如: 我想这样做(当然这个语法是不正确的): 为了扩展这一点,我可能将许多列的名称存储在一个变量中(比如< code>col_names),我想这样做: 这样做的正确方法是什么?
我正试图建立一个基本的计算器,但我的代码不加起来。我的计算器应该做的是对输入num1和NUM2中插入的两个数进行加、减、除或乘。然后将答案打印在空的div中,并将答案作为ID。 null null
我是JavaFX新手,正在尝试用GridPane做一个简单的按钮设计。 我不知道如何让一个按钮跨越多个列/行,而不把其他按钮推开。我一直在使用HBox和VBox将其他按钮组合在一起。我试过在按钮上设置Rowspan,但似乎不起作用。 看起来怎么样 我希望它看起来怎么样 这是我的代码:
我想实现一个网格布局,它能够基于位置跨越多个行和列。假设跨度计数为3。项目位置零,取两行跨和两列跨,项目位置一取两列跨和一行跨项目位置二,取一列跨和一行跨项目位置三,取一列跨和一行跨 基本上,我希望视图根据其位置跨越各种列和行。 我尝试使用SetPansizeLookup方法使用回收视图的GridLayoutManager,但它跨越了水平或垂直视图。 我发现twowayview可以用于跨越多个列和