让我们从我的数据开始。
> dput(head(tbl_ready)) ## To make it clear I didn't put all of the row names
structure(list(Gene_name = structure(1:6, .Label = c("AT1G01050",
"AT1G01080", "AT1G01090", "AT1G01220", "AT1G01320", "AT1G01420",
"AT1G01470", "AT1G01800", "AT1G01910", "AT1G01920", "AT1G01960",
"AT5G66570", "AT5G66720", "AT5G66760", "AT5G67150", "AT5G67360",
"ATCG00120", "ATCG00160", "ATCG00170", "ATCG00190", "ATCG00380",
"ATCG00470", "ATCG00480", "ATCG00490", "ATCG00500", "ATCG00650",
"ATCG00660", "ATCG00670", "ATCG00750", "ATCG00770", "ATCG00780",
"ATCG00800", "ATCG00810", "ATCG00820", "ATCG01090", "ATCG01110",
"ATCG01120", "ATCG01240", "ATCG01300", "ATCG01310", "ATMG01190"
), class = "factor"), `10` = c(0, 0, 0, 0, 0, 0), `20` = c(0,
0, 0, 0, 0, 0), `52.5` = c(0, 1, 0, 0, 0, 0), `81` = c(0, 0.660693687777888,
0, 0, 0, 0), `110` = c(0, 0.521435654491704, 0, 0, 0, 1), `140.5` = c(0,
0.437291194705566, 0, 0, 0, 1), `189` = c(0, 0.52204783488213,
0, 0, 0, 0), `222.5` = c(0, 0.524298383907171, 0, 0, 0, 0), `278` = c(1,
0.376865096972469, 0, 1, 0, 0), `340` = c(0, 0, 0, 0, 0, 0),
`397` = c(0, 0, 0, 0, 0, 0), `453.5` = c(0, 0, 0, 0, 0, 0
), `529` = c(0, 0, 0, 0, 0, 0), `580` = c(0, 0, 0, 0, 0,
0), `630.5` = c(0, 0, 0, 0, 0, 0), `683.5` = c(0, 0, 0, 0,
0, 0), `735.5` = c(0, 0, 0, 0, 0, 0), `784` = c(0, 0, 0.476101907006443,
0, 0, 0), `832` = c(0, 0, 1, 0, 0, 0), `882.5` = c(0, 0,
0, 0, 0, 0), `926.5` = c(0, 0, 0, 0, 1, 0), `973` = c(0,
0, 0, 0, 0, 0), `1108` = c(0, 0, 0, 0, 0, 0), `1200` = c(0,
0, 0, 0, 0, 0)), .Names = c("Gene_name", "10", "20", "52.5",
"81", "110", "140.5", "189", "222.5", "278", "340", "397", "453.5",
"529", "580", "630.5", "683.5", "735.5", "784", "832", "882.5",
"926.5", "973", "1108", "1200"), row.names = c(NA, 6L), class = "data.frame")
查看列的名称(刚刚选择其中的6个):
10
20
52.5
81
110
140.5
这些名字告诉我尺寸范围。第一列中基因的大小从10开始,到第二列开始时结束= 20.这意味着第一列应该属于大小在10-20之间的基因。
我还有另一张桌子告诉我所有基因的大小(我的第一张桌子上的内容还有很多):
>dput(head(tbl_size))
structure(list(Gene_name = structure(1:6, .Label = c("ATMG01290", "ATMG01300", "ATMG01310", "ATMG01320", "ATMG01330",
"ATMG01350", "ATMG01360", "ATMG01370", "ATMG01400", "ATMG01410"
), class = "factor"), tp = c(26L, 17L, 22L, 142L, 12L, 45L),
size = c(49.4255, 28.0913, 40.2872, 213.572, 24.4838, 70.4375
)), .Names = c("locus", "tp", "size"), row.names = c(NA,
6L), class = "data.frame")
现在是主要部分。我希望用我的代码实现什么?
所以,我试图找到那些在分数(列)中发现的基因,其大小范围比基因的实际大小高两倍。不知道你是否明白我想要做什么,所以让我举一个例子。
所以,让我们说我们有一个基因:
Names Size
AT1G01080 40
AT1G01090 30
AT1G01220 50
让我们将大小乘以2:
Names Size
AT1G01080 80
AT1G01090 60
AT1G01220 100
在第一个表(tbl_ready
)中,我们可以找到我在该线程开始时解释的基因列表和由大小定义的特定分数(列)。如果在分数(列)中找到任何基因,并且至少比基因大小高两倍,我想把0代替任何值。
要查找基因的大小,您必须在第二个表格中查看(tbl_size
)。
总结一下。我试图确定哪些基因至少是2的复合物。因此,只有大小比基因大小高两倍的部分对我来说很重要。
如果有人知道我在做什么,请编写我的问题以使其可读。我感觉我的脑子已经死了。
答案 0 :(得分:3)
首先,将列转换为其数值:
frac <- as.numeric(colnames(tbl_ready))
然后获得列的每个基因的索引不超过它的压力两倍:
ind <- lapply(tbl_size$size, function(x) which(frac > x*2)[1]-1)
然后,您可以创建需要设置为零的值的数组索引:
rowI = rep(match(tbl_size$locus, tbl_ready$Gene_name), times=ind-1)
colI = unlist(mapply(seq, from=2, length=ind-1))
tbl_ready[cbind(rowI, colI)] <- 0
如果gene_names没有与locus的1:1映射,以及没有任何列超过基因大小两倍的情况,你必须要小心,因为会有需要处理的NA。我假设您使用了这些数据表示法,因为将tbl_ready存储在比此处更长的更窄的形式中可能会更好(仅包含三列名称,大小和值 - 并省略零值)。
答案 1 :(得分:1)
我将改变原来的答案,这一次使用您提供的数据 - 唯一真正的区别是您更改了列名称(我假设列tbl_size中的tp
是我们需要与tbl_ready中的列标题匹配的东西,而table_size中的某些行不对应于tbl_ready。
首先,将列转换为其数值:
frac <- as.numeric(colnames(tbl_ready))
然后得到列的每个基因的索引,它不会超过它的两倍:
mapToReady <- tbl_size$locus %in% tbl_ready[[1]]
ind <- sapply(tbl_size$tp[mapToReady], function(x) which(frac > x*2)[1]-1)
然后,您可以创建需要设置为零的值的数组索引:
rowI = rep(match(tbl_size$locus[mapToReady], tbl_ready[[1]]), times=ind-1)
colI = unlist(mapply(seq, from=2, length=ind-1))
tbl_ready[cbind(rowI, colI)] <- 0
因此,例如,AT1G01050是tbl_size的第5行(之前的条目都没有在tbl_size中有条目),以及tbl_ready的第一行。所以第一次迭代&#39;的营业额点击&lt; tbl_size $ tp [mapToReady] [1]&#39;这是AT1G01050的tp为12. 2 * 12为24,因此介于20.0和52.5之间,因此我们需要设置对应于&#39; 10&#39;和&#39的列; 20&#39;为零,但不是列#52.5&#39;对于AT1G01050。这对应于tbl_ready第1行的第2列和第3列,这是最后三行的cbind
部分正在进行的操作。