我无法想出一种创建tapply的方法来将数据设置到我的主数据框中。以下是我到目前为止通过plain 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]
}
初始tapply创建一个包含2个因子和2个列表的数据帧。我正在使用for循环来对特定系列的条目进行子集化,以替换数据中的tapplied列表。
**编辑**
我附加了dput数据的子集。
scaled_data:
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")
all_genes:
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")
答案 0 :(得分:3)
安装data.table包。 dict
通过引用将您的setDT
数据框转换为数据表。然后,您可以按all_genes
和all_genes
对ens_gene
数据进行分组,然后使用该子集的location
函数计算zscores。
scale
要确认您的结果,请将一个基因和一个位置的子集,并将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)
数据表的zscore_tpm
进行比较。
all_genes