关于r:如何将for循环转换为tapply?


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软件包。 setDT通过引用将您的all_genes数据帧转换为数据表。然后,可以将all_genes数据按ens_genelocation分组,然后使用scale函数对该子集计算zscore。

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

要确认结果,请对一个基因和一个位置进行子集处理,并将scale(tpm)all_genes数据表的zscore_tpm进行比较。

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