How to convert a for loop into an tapply?
我在想办法创建一个将数据设置到主数据帧中的方式时遇到了麻烦。以下是我到目前为止通过普通for循环所拥有的内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #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] } |
最初的Tapply创建一个包含2个因子和2个列表的数据框。我正在使用for循环将特定的一系列条目子集化,以替换为数据中的轻拍列表。
**编辑**
我正在附加dput数据的子集。
scaled_data:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | structure(list(GENE = structure(1:3, .Label = c("ENSMUSG00000000001", "ENSMUSG00000000049","ENSMUSG00000000078"), class ="factor"), Dorsal = structure(list(ENSMUSG00000000001 = structure(c(-1.16717546830451, 1.41698163565083, 0.779151926408398, 0.193579534793182, -0.266294479654671, -0.956243148893228), .Dim = c(6L, 1L),"`scaled:center`" = 6.33363082170642,"`scaled:scale`" = 0.790650769894463), ENSMUSG00000000049 = structure(c(1.04629734842125, -0.379768423530088, -0.159697382988325, 1.38101242588283, -1.09617474289521, -0.791669224890459), .Dim = c(6L, 1L),"`scaled:center`" = 6.38171130509969,"`scaled:scale`" = 0.779444180855466), ENSMUSG00000000078 = structure(c(-1.11801193568966, 1.04291124440607, 0.250500998518554, -1.18170895786312, 1.0934381919535, -0.0871295413253488), .Dim = c(6L, 1L),"`scaled:center`" = 5.92201857410449,"`scaled:scale`" = 0.732329547420904)), .Names = c("ENSMUSG00000000001", "ENSMUSG00000000049","ENSMUSG00000000078")), Tail = structure(list( ENSMUSG00000000001 = structure(c(-0.157347003001748, -0.678638754924475, 1.57863880342379, -0.594055811402973, 0.836373665728917, -0.984970899823516), .Dim = c(6L, 1L),"`scaled:center`" = 5.94170180304597,"`scaled:scale`" = 0.791567750089061), ENSMUSG00000000049 = structure(c(-0.986133476407471, -0.564190604242369, -0.403138176071026, 1.31163618088139, 1.2210101196216, -0.57918404378212), .Dim = c(6L, 1L),"`scaled:center`" = 6.02879394835327,"`scaled:scale`" = 0.941808642921153), ENSMUSG00000000078 = structure(c(0.641460247975549, -1.00373958934916, -1.48812164900278, 0.282729227361309, 0.953830514551981, 0.613841248463103), .Dim = c(6L, 1L),"`scaled:center`" = 6.26062376638098,"`scaled:scale`" = 0.770309626794679)), .Names = c("ENSMUSG00000000001", "ENSMUSG00000000049","ENSMUSG00000000078"))), .Names = c("GENE", "Dorsal","Tail"), row.names = c(NA, 3L), class ="data.frame") |
所有基因:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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软件包。
1 2 3 4 5 6 7 8 9 10 11 12 | 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 |
要确认结果,请对一个基因和一个位置进行子集处理,并将
1 2 3 | a1 <- subset(all_genes, ens_gene =="ENSMUSG00000000001" & Location =="D") identical(scale(a1$tpm)[,1], a1$zscore_tpm[1:6]) # [1] TRUE |