如何将for循环转换为tapply?

如何将for循环转换为tapply?,r,R,我很难想出一种方法来创建一个tapply来将数据设置到我的主数据框中。以下是到目前为止我通过普通for循环得到的结果 #Scale based on gene and tissue geneFacList=list(GENE = all_genes$ens_gene, LOCATION = all_genes$Location) #Return back z scaled data scale_z = function(x){ return(scale(x)) }

我很难想出一种方法来创建一个tapply来将数据设置到我的主数据框中。以下是到目前为止我通过普通for循环得到的结果

#Scale based on gene and tissue
geneFacList=list(GENE = all_genes$ens_gene,
            LOCATION = all_genes$Location)

#Return back z scaled data
scale_z = function(x){
  return(scale(x))
}

scaled_data <- melt(tapply(all_genes$tpm, INDEX= geneFacList,
                 FUN=scale_z))

scaled_data$LOCATION = NULL
scaled_data = unique(scaled_data)
names(scaled_data) = c("GENE", "Dorsal", "Tail")

for(i in unique(scaled_data$GENE)){
  scaled_subset = subset(scaled_data, GENE == i)
  all_genes$Scale[which(all_genes$ens_gene == i & all_genes$Location == "D")] = scaled_subset$Dorsal[[1]][,1]
  all_genes$Scale[which(all_genes$ens_gene == i & all_genes$Location == "T")] = scaled_subset$Tail[[1]][,1]
}
所有_基因:

structure(list(tpm = c(5.41080263908952, 5.81715098989662, 5.40451325068716, 
7.19130136887543, 7.45396844286006, 5.47146638098639, 6.94966789218597, 
6.60374822386075, 6.48668462992646, 6.12308488634881, 5.57757643982768, 
5.16203060396947, 7.19724168477114, 5.10004491719883, 6.08570301730651, 
6.2572361092316, 5.4974343610229, 7.45813340414315, 5.64911492983811, 
7.26410423987545, 5.52730428054929, 5.76464933459647, 7.17875183210708, 
5.48331341007724, 5.10326539922971, 6.75474677060265, 5.48743349791039, 
6.68577329372056, 6.10546785697807, 5.05661818780936, 6.72277567035053, 
5.11430933431257, 6.47841281199362, 5.85821103653871, 6.9953685940709, 
6.73347158939578), ens_gene = c("ENSMUSG00000000001", "ENSMUSG00000000001", 
"ENSMUSG00000000001", "ENSMUSG00000000001", "ENSMUSG00000000001", 
"ENSMUSG00000000001", "ENSMUSG00000000001", "ENSMUSG00000000001", 
"ENSMUSG00000000001", "ENSMUSG00000000001", "ENSMUSG00000000001", 
"ENSMUSG00000000001", "ENSMUSG00000000049", "ENSMUSG00000000049", 
"ENSMUSG00000000049", "ENSMUSG00000000049", "ENSMUSG00000000049", 
"ENSMUSG00000000049", "ENSMUSG00000000049", "ENSMUSG00000000049", 
"ENSMUSG00000000049", "ENSMUSG00000000049", "ENSMUSG00000000049", 
"ENSMUSG00000000049", "ENSMUSG00000000078", "ENSMUSG00000000078", 
"ENSMUSG00000000078", "ENSMUSG00000000078", "ENSMUSG00000000078", 
"ENSMUSG00000000078", "ENSMUSG00000000078", "ENSMUSG00000000078", 
"ENSMUSG00000000078", "ENSMUSG00000000078", "ENSMUSG00000000078", 
"ENSMUSG00000000078"), Location = structure(c(1L, 2L, 2L, 2L, 
1L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 2L, 
1L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 2L
), .Label = c("D", "T"), class = "factor"), Genotype = structure(c(2L, 
2L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 
1L, 2L, 1L), .Label = c("KO", "WT"), class = "factor"), ScaledData = c(1.0237348707067, 
-0.0573732288515318, -0.127459965968496, 1.70391138799745, -0.336231912943951, 
-1.39614781763678, -0.900965591956414, 0.183854587453607, -1.28320381094869, 
0.387390863677792, 1.10927558146456, -0.306784962994251, -0.0243525932951088, 
1.52776000579625, -1.61507768419322, -0.00773799094143105, -0.141281687495458, 
-0.377027655038141, -0.913674368563014, -1.15105740395194, 1.32835476226276, 
0.695841161205141, -0.0188124970843588, 0.697065951298522, 1.51445318809622, 
0.0841925450583373, -0.867990291011405, 0.0190253799951846, 0.20885098517954, 
-0.596980970481067, 0.33566289126491, 0.446413913310098, -0.305895356184479, 
-1.48101147405479, -1.04579286493211, 1.68907205375956)), .Names = c("tpm", 
"ens_gene", "Location", "Genotype", "ScaledData"), row.names = c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 25L, 26L, 27L, 
28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 
41L, 42L, 43L, 44L, 45L, 46L, 47L, 48L), class = "data.frame")

安装data.table包
setDT
通过引用将您的
所有基因
dataframe转换为datatable。然后,您可以通过
ens_gene
location
所有_基因
数据进行分组,然后使用该子集的
scale
函数计算zscore

library(data.table)
setDT(all_genes)
all_genes[, zscore_tpm := scale(tpm), by = .(ens_gene, Location)]

> head(all_genes)
#       tpm      ens_gene          Location Genotype ScaledData zscore_tpm
# 1: 5.410803 ENSMUSG00000000001        D       WT  1.02373487 -1.1671755
# 2: 5.817151 ENSMUSG00000000001        T       WT -0.05737323 -0.1573470
# 3: 5.404513 ENSMUSG00000000001        T       WT -0.12745997 -0.6786388
# 4: 7.191301 ENSMUSG00000000001        T       KO  1.70391139  1.5786388
# 5: 7.453968 ENSMUSG00000000001        D       WT -0.33623191  1.4169816
# 6: 5.471466 ENSMUSG00000000001        T       WT -1.39614782 -0.5940558
为确认结果,对一个基因和一个位置进行子集划分,并将
量表(tpm)
所有基因的
zscore\u tpm
数据表进行比较

a1 <- subset(all_genes, ens_gene == "ENSMUSG00000000001" & Location == "D")
identical(scale(a1$tpm)[,1], a1$zscore_tpm[1:6])
# [1] TRUE

a1安装data.table包
setDT
通过引用将您的
所有基因
dataframe转换为datatable。然后,您可以通过
ens_gene
location
所有_基因
数据进行分组,然后使用该子集的
scale
函数计算zscore

library(data.table)
setDT(all_genes)
all_genes[, zscore_tpm := scale(tpm), by = .(ens_gene, Location)]

> head(all_genes)
#       tpm      ens_gene          Location Genotype ScaledData zscore_tpm
# 1: 5.410803 ENSMUSG00000000001        D       WT  1.02373487 -1.1671755
# 2: 5.817151 ENSMUSG00000000001        T       WT -0.05737323 -0.1573470
# 3: 5.404513 ENSMUSG00000000001        T       WT -0.12745997 -0.6786388
# 4: 7.191301 ENSMUSG00000000001        T       KO  1.70391139  1.5786388
# 5: 7.453968 ENSMUSG00000000001        D       WT -0.33623191  1.4169816
# 6: 5.471466 ENSMUSG00000000001        T       WT -1.39614782 -0.5940558
为确认结果,对一个基因和一个位置进行子集划分,并将
量表(tpm)
所有基因的
zscore\u tpm
数据表进行比较

a1 <- subset(all_genes, ens_gene == "ENSMUSG00000000001" & Location == "D")
identical(scale(a1$tpm)[,1], a1$zscore_tpm[1:6])
# [1] TRUE

a1我上传了dput数据。如果我必须更改格式,请告诉我,似乎stack overflow希望我缩进4个空格,因为这是代码。因此,本质上,我正在尝试根据每个ens_基因和位置从tpm变量中查找z分数。从那里,我想用它们各自行的z值更新所有的_genes$Scale。如果我必须更改格式,请告诉我,似乎stack overflow希望我缩进4个空格,因为这是代码。因此,本质上,我正在尝试根据每个ens_基因和位置从tpm变量中查找z分数。从那个里,我想用它们各自行的z值更新所有的_genes$Scale。