我正在嘗試決議 R 中的長資料框。我正在尋找 tau 列中值大于 0.7 的行。然后,我在長格式資料框中找到所有其他行,這些行在geneID 列中具有相同的名稱,在物種列中具有相同的名稱,但在組織列中具有不同的名稱。我必須檢查其中哪些在 log2expression 中具有最高值,然后將該組織的名稱放在具有相同基因 ID 和物種列的每一行的偏置列中。我有一個作業回圈,但目前它很慢而且相當丑陋:
long_tau$biased <- 'general'
for(gRow in 1:nrow(long_tau)) {
print(gRow)
if(!is.nan(long_tau$tau[gRow])){
if(long_tau$tau[gRow] >= 0.7){
tmpGenes <- long_tau %>% filter_all(any_vars(. %in% c(long_tau$GeneID[gRow]))) %>%
filter_all(any_vars(. %in% c(long_tau$species[gRow])))
long_tau$biased[gRow] <- tmpGenes[which.max(tmpGenes$log2Expression),]$tissue
}}
}
我想知道我能做些什么來提高效率。我在想我可以嘗試為我放入 tmpGenes 資料框中的所有過濾行一次指定偏向列。然后我可以跳過所有在有偏差的列中字串與“general”不同的行。我不知道我會怎么做。歡迎其他提高效率的想法。
資料如下所示:
基因ID | 頭 | 物種 | 組織 | log2運算式 | 有偏見的 |
---|---|---|---|---|---|
Solyc01g005000.3 | 0.7000207 | lyc | 臭蟲 | 5.40986856 | 臭蟲 |
每次我制作 tmpGenes 時,它都有三行,每個組織一個。
謝謝你的幫助。根據要求在此處使用 dput() 添加了一些行。
structure(list(GeneID = c("Solyc01g005000.3", "Solyc01g005010.4",
"Solyc01g005020.3", "Solyc01g005030.4", "Solyc01g005040.3", "Solyc01g005050.4",
"Solyc01g005060.3"), tau = c(0.700020714228337, 0.519089831890165,
0.527472673446906, 0.513496977771781, NaN, 1, 1), species = c("lyc",
"lyc", "lyc", "lyc", "lyc", "lyc", "lyc"), tissue = c("styungerm",
"styungerm", "styungerm", "styungerm", "styungerm", "styungerm",
"styungerm"), log2Expression = c(5.40986855973033, 3.79990010472802,
5.94750789262394, 5.27701171052278, 0, 0, 0), specific = c(FALSE,
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), PME = c(FALSE, FALSE,
FALSE, FALSE, FALSE, FALSE, FALSE), PMEI = c(FALSE, FALSE, FALSE,
FALSE, FALSE, FALSE, FALSE), biased = c("styungerm", "general",
"general", "general", "general", "pollen", "leaf")), row.names = 6:12, class = "data.frame")
tmpGenes 中的行:
structure(list(GeneID = c("Solyc07g005715.1", "Solyc07g005715.1",
"Solyc07g005715.1"), tau = c(1, 1, 1), species = c("lyc", "lyc",
"lyc"), tissue = c("styungerm", "pollen", "leaf"), log2Expression = c(0,
0.574076953583166, 0), specific = c(FALSE, FALSE, FALSE), PME = c(FALSE,
FALSE, FALSE), PMEI = c(FALSE, FALSE, FALSE), biased = c("general",
"general", "general")), row.names = c(NA, -3L), class = "data.frame")
uj5u.com熱心網友回復:
在base
R 中,考慮ave
按一個或多個組計算聚合。注意下面使用\(x)
R 4.1.0 中引入的類似 lambda 的符號。用于function(x)
以前的版本。
long_tau <- within(
long_tau, {
# CALCULATE MAX log2Expression BY GeneID AND species
max_log2exp <- ave(log2Expression, GeneID, species, FUN=\(x) max(x, na.rm=TRUE))
# CONDITIONALLY ASSIGN NEW biased COLUMN
biased <- ifelse(
log2Expression == max_log2exp & tau >= 0.7 & !is.na(tau), tissue, "general"
)
# REMOVE HELPER CALCULATION
rm(max_log2exp)
}
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/470709.html