2016-07-27 3 views
0

데이터를 메인 데이터 프레임으로 설정하는 방법을 생각하는 데 문제가 있습니다. 다음은 plain for loop를 통해 지금까지 내가 가지고있는 것이다.for 루프를 tapply로 변환하는 방법은 무엇입니까?

#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 목록을 대체합니다.

** 편집 **

출력 데이터의 하위 집합을 첨부하고 있습니다.

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.708, 
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

나는 데이터를 출력했다. 스택 오버플로가 코드이기 때문에 4 칸 들여 쓰기를 원했던 것처럼 형식을 변경해야하는지 알려주세요. – dchen71

+0

그래서 기본적으로 ens_gene 및 Location 당 tpm 변수에서 z 점수를 찾으려고합니다. 여기에서 all_genes $ Scale을 해당 행의 z 값으로 업데이트하려고합니다. – dchen71

답변

3

data.table 패키지를 설치합니다. setDTall_genes 데이터 프레임을 참조로 데이터 테이블로 변환합니다. 그런 다음 all_genes 데이터를 ens_genelocation으로 그룹화 한 다음 해당 하위 집합에 대해 scale 함수를 사용하여 zscores를 계산할 수 있습니다.

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 

, 당신의 결과를 확인 한 유전자와 하나 개의 위치를 ​​부분 집합 및 all_genes 데이터 테이블의 zscore_tpm으로 scale(tpm)을 비교합니다.

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