2015-02-05 4 views
0

그래서이 루프가 있고 여러 csv 파일을 씁니다. 각각의 파일은 실행 결과에 추가됩니다. 아래에서 볼 수 있듯이,이 특정 루프는 gex에서 mxy에 대한 부분 집합의 각 행에 통계 함수 (zScore)를 실행 한 다음 각 행의 결과를 게시 한 다음 gex의 다음 하위 집합으로 이동합니다.R : for 루프에서 데이터 프레임에 추가하기

제 질문은 첨부 된 결과를 csv 파일로 작성하는 대신 동일한 모양의 루프 내에서 데이터 프레임을 만들 수있는 방법이 있습니까?

친절한 도움에 감사드립니다. 게시 된 코드에서

gex <- data.frame("sample" = c("BIX","HEF","TUR","ZOP","VAG"), 
        "TCGA-F4-6703-01" = runif(5, -1, 1), 
        "TCGA-DM-A28E-01" = runif(5, -1, 1), 
        "TCGA-AY-6197-01" = runif(5, -1, 1), 
        "TCGA-A6-5657-01" = runif(5, -1, 1)) 
colnames(gex) <- gsub("[.]", "_",colnames(gex)) 

listx <- c("TCGA_DM_A28E_01","TCGA_A6_5657_01") 

mxy <- data.frame("TCGA-AD-6963-01" = runif(5, -1, 1), 
        "TCGA-AA-3663-11" = runif(5, -1, 1), 
        "TCGA-AD-6901-01" = runif(5, -1, 1), 
        "TCGA-AZ-2511-01" = runif(5, -1, 1), 
        "TCGA-A6-A567-01" = runif(5, -1, 1)) 

colnames(mxy) <- gsub("[.]", "_",colnames(mxy)) 

zScore <- function(x,y)((as.numeric(x) - as.numeric(rowMeans(y,na.rm=T)))/as.numeric(sd(y,na.rm=T))) 

    for(i in seq(nrow(mxy))){ 
     for(colName in listx){ 
     zvalues <- zScore(gex[i,colName], 
          mxy[i,]) 
     geneexptest <- data.frame(gex$sample[i], zvalues, row.names = NULL, 
            stringsAsFactors = TRUE) 
     write.table(geneexptest, file = paste0(colName, "mxyinput", ".csv"), 
        row.names=FALSE, col.names=FALSE, quote=F, 
        sep = ",", dec = ".", append=(i > 1)) 
     } 
    } 
+1

루프 밖에서 데이터 프레임을 선언 한 다음'rbind' 또는'cbind'를 사용하여 루프의 각 반복에서 행이나 열을 추가 하시겠습니까? –

+0

안녕하세요, @SamFirke, 의견에 감사드립니다. 어떻게 루프의 각 반복을 활용하면서 "루프 외부의 데이터 프레임을 선언합니까?" –

+0

@SamFirke 이것은 R에서 매우 비효율적입니다. [The R Inferno] (http://www.burns-stat.com/pages/Tutor/R_inferno.pdf)의 Circle 2를 확인하십시오. – josliber

답변

2

당신은 listx의 각 요소에 대해 하나 개의 CSV 파일을 가지고, 당신은 각 파일에 라인 하나씩의 번호를 쓰고있다. 대신 listx의 각 요소에 대한 데이터 프레임을 만들고 write.table을 한 번 호출하여 각각을 쓸 수 있습니다.

dfs <- lapply(listx, function(colName) { 
    do.call(rbind, lapply(seq(nrow(mxy)), function(i) { 
    zvalues <- zScore(gex[i,colName], mxy[i,]) 
    data.frame(gex$sample[i], zvalues, row.names = NULL, stringsAsFactors = TRUE) 
    })) 
}) 
dfs 
# [[1]] 
# gex.sample.i. zvalues 
# 1   BIX 1.1105593 
# 2   HEF 0.5451948 
# 3   TUR -1.4060388 
# 4   ZOP -1.4218218 
# 5   VAG 0.2780513 
# 
# [[2]] 
# gex.sample.i. zvalues 
# 1   BIX 2.0607386 
# 2   HEF 1.6703912 
# 3   TUR 1.3249181 
# 4   ZOP 0.8865058 
# 5   VAG 1.5289732 

이제 write.table을 사용하여 각 열에 대한 전체 데이터 프레임을 출력 할 수 있습니다. 각 루프 반복에서 rbind를 호출하는 것보다 훨씬 더 효율적입니다 rbind 단일 호출에서 함께 모든 데이터 프레임을 결합

; 자세한 내용은 동그라미 2 The R Inferno을 참조하십시오.

+0

효율성 측면에서 변경 사항을 이해하지만 원하는 방식으로 컴파일하는 것이 아닙니다. 내 문제는 당신이 OP에서 볼 수 있듯이, 내가 그것을 만들 때마다'geneexptest '라고 씁니다. 열쇠는'write.table'에'append = (i> 1)'옵션이 있습니다. 나는 똑같은 일을하고 싶지만 geneexptest (추가 된 형태로 ...)를 다른 데이터 프레임으로 조작 한 다음 CSV에 써 넣는다. (다음 라운드 등으로 이동). 어떻게 내가 그걸 할 수 있었는지 알았어? –

+0

@HenriW이 코드는 모든 단일 'geneexptest'를 단일 데이터 프레임에 추가합니다. 당신은'write.table'을 사용하여 끝에 파일에 쓸 수 있습니다. 불행히도 원래 게시물을 재현 할 수 없습니다 (게시 된 코드를 실행할 수는 없습니다). 따라서 기능을 정확히 복제하기가 어렵습니다. 도움이 더 필요하면 질문을 업데이트하여 재현성있게 만드십시오. – josliber

+0

관련 입력을 만들기 위해 몇 가지 사항을 첨부했습니다. 귀하의 의견을 알려주십시오. 그래서 같은 기능을 갖기를 원하지만, 각 라운드가'write.table'에 출력되기 전에 몇 가지 추가적인 조작을 포함 할 수 있습니다. 그래서 for 루프 내에서 데이터 프레임을 추가하는 것에 대해 질문했습니다. –

관련 문제