2017-05-08 3 views
0

196 개의 열이있는 단일 데이터 프레임에서 여러 열 이름 하위 문자열을 기반으로 여러 CSV 파일을 작성하는 데 R에서 어려움을 겪고 있습니다. 희미 = [44,196] 처음 4 열 및 행는 다음과 같다 :데이터 프레임의 colnames에서 여러 문자열을 기반으로 여러 열을 추출하려면 어떻게합니까?

 X1_tumor X1_normal X2_tumor X2_normal 
gene   5   7  8  11 
gene2  7   4  9   4 
gene3  6   7  6   7 
gene4  9   8  9  87 

서브 샘플은 여기에 도시 개의 제 98 개 가지의 샘플 문자 벡터된다

[1] "X1_tumor" "X1_normal" 

I 카운트의 쌍을 추출하고 싶은이 첫 번째 2 자 "1_"과 같은 빼기 수의 이름에서 일치하는 텍스트를 기반으로하여 개별 csv 파일에 작성하여 두 개의 열로 된 98 개의 csv 파일을 생성합니다. 예 : columns = 1_tumor 및 1_normal

다음을 포함하여 많은 것을 시도했습니다 :

for subsamples in subtractedcounts 
{{(lapply(subsamples, 
function(y)substring((subsamples[seq(1,98,1)])1,2), y = n) { 
lapply(subsamples, function(x) write.csv(subtractedcounts[,grepl("n",colnames(subtractedcounts))], paste(x, ".csv", sep = ""))) 
}} 

이것은 정확하게 명명되었지만 모두 196 개의 열을 포함하는 98 개의 csv 파일을 반환합니다 (예 : 뺄셈 한 전체 수). "1_"과 같은 적절한 부분 문자열을 포함하는 두 개의 열만을 원합니다. 이상적으로이 보일 것 같은 :

 X1_tumor X1_normal 
gene   5   7 
gene1  7   4 
gene2  6   7 
gene4  9   8 

subtractedcounts rownames 현재 내가 일을 계속하고 싶은 .CSV 년대의 첫 번째 열에로 반환되고있다 (내 데이터 프레임).

도움 주셔서 감사합니다.

답변

0

다음 예를 사용 :

df = data.frame(x1_normal = c(7,4,7,8), 
       x1_tumor = c(5,7,6,9), 
       x15_tumor = c(15,17,16,19), 
       x3_tumor = c(35,37,36,39), 
       x15_normal = c(17,14,17,18), 
       x3_normal = c(37,34,37,38)) 
row.names(df) = c("gene","gene2","gene3","gene4") 

> df 
     x1_normal x1_tumor x15_tumor x3_tumor x15_normal x3_normal 
gene   7  5  15  35   17  37 
gene2   4  7  17  37   14  34 
gene3   7  6  16  36   17  37 
gene4   8  9  19  39   18  38 

당신이 열이 혼합 볼 수 있듯이. 또한 는 이제 모든 x??_tumor 위해 쌍으로 그들을 통해 해당 x??_normal

첫 번째 정렬 열 이름 다음 루프가 가정하자 :

sortedNames = sort(colnames(df)) 

for(k in seq(1,ncol(df),2)){ 
    print(df[,c(sortedNames[k],sortedNames[k+1])]) 
} 

내가 인쇄를 사용,하지만 당신은에 의해 교체 할 수 있습니다 write.csv_ 전에 문자열을 추출하여 얻은 파일 이름을 사용하십시오. sortedNames[k]

루프 결과 :

 x1_normal x1_tumor 
gene   7  5 
gene2   4  7 
gene3   7  6 
gene4   8  9 

     x15_normal x15_tumor 
gene   17  15 
gene2   14  17 
gene3   17  16 
gene4   18  19 

     x3_normal x3_tumor 
gene   37  35 
gene2  34  37 
gene3  37  36 
gene4  38  39 
0

감사합니다. R. Schifini. 나는 또한 다음을 사용하여 작동시킬 수있었습니다.

for(z in subsamples[1:98]) 
{ lapply(z, function(x) write.csv(subtractedcounts[,grepl(z,colnames(subtractedcounts))], paste(x, ".csv", sep = ""))) 
} 
관련 문제