2013-06-18 1 views
12

에 의해 누락 된 값으로 하나 개의 데이터 프레임으로 데이터 프레임의 목록을 병합 이 .txt 특정 폴더에있는 파일, 나는 함수 작성했습니다 :R은 - 나는 세트를 가지고 내가 <p>R.</p>에서 함께 일을 병합하는 방법의 오 - 너무 - 일반적인 문제의 변형을 행

  • 내가 원하는 파일 목록을하게 한 다음 각 파일
  • 에 대한에 (파일을
  • 집합 데이터를 읽고 관심있는 행과 열만 추출)
  • 데이터에 대한 일부 계산을 수행합니다.
  • 은 이러한 새 값을 목록에 추가합니다. 각 변수

    >str(DataList) 
    List of 16 
    $ :'data.frame': 14 obs. of 2 variables: 
        ..$ Sample: Factor w/ 14 levels "Sample_1A","Sample_1B",..: 1 2 3 4 5 6 7 8 9 10 ... 
        ..$ Var1 : num [1:14] 27.9 33.8 29.9 29.4 28.8 ... 
    $ :'data.frame': 14 obs. of 2 variables: 
        ..$ Sample: Factor w/ 14 levels "Sample_1A","Sample_1B",..: 1 2 3 4 5 6 7 8 9 10 ... 
        ..$ Var2 : num [1:14] 24.6 27 26.8 26.7 27.2 ... 
    $ :'data.frame': 12 obs. of 2 variables: 
        ..$ Sample: Factor w/ 14 levels "Sample_1A","Sample_1B",..: 1 2 3 4 5 6 7 9 11 12 ... 
        ..$ Var3 : num [1:12] 31.4 35.6 34 35.7 32.5 ... 
    

    I 컬럼 Sample 수치 값의 열이 (Var1, Var2, Var3, ...)

내가 끝낼하면 다음과 같은 구조의 목록이다.

Sample은 항상 14 레벨의 요소입니다. 이 수준은 각 변수에 대해 동일합니다.

일부 변수 (위의 Var3과 같은)에는 Sample의 각 레벨에 대한 관찰이 없습니다.

내가 끝내기 원하는 것은 14 행 (각 레벨에 대해 하나씩 Sample)의 데이터 프레임입니다. 첫 번째 열은 Sample이어야합니다. 각 변수에 대해, 그래서 같이 해당 숫자 값을 포함하는 열이 있어야합니다 :

Sample  Var1 Var2 Var3 
Sample_1A 27.9 24.6 31.4 
Sample_1B 33.8 27  35.6 
... 
Sample_3B 26.8 29.7 NA 

내가 do.call이 작업을 수행하기 위해 노력했지만 by에 대한 인수를 전달하는 방법을 모른다; cbind은 누락 된 값 때문에 불만을 갖습니다. 이 작업을 수행하는 방법에 대한 의견이 있으십니까?

감사합니다.

편집 : joran의 요청에 따라 :

>dput(DataList[1:3]) 
list(structure(list(Sample = structure(1:14, .Label = c("Sample_1B", "Sample_1C", "Sample_1D", "Sample_2C", "Sample_2A", "Sample_2D", "Sample_3B", "Sample_3C", "Sample_3A", "Sample_3D", "Sample_4B", "Sample_4C", "Sample_4A", "Sample_4D"), class = "factor"), Var1 = c(26.9333333333333, 29.17, 28.9366666666667, 28.9233333333333, 28.61, 28.63, 26.7933333333333, 34.6633333333333, 30.4966666666667, 28.4433333333333, 27.4533333333333, 28.3, 27.9633333333333, 27.2366666666667)), .Names = c("Sample", "Var1"), row.names = c(NA, -14L), class = "data.frame"), structure(list(Sample = structure(1:14, .Label = c("Sample_1B", "Sample_1C", "Sample_1D", "Sample_2C", "Sample_2A", "Sample_2D", "Sample_3B", "Sample_3C", "Sample_3A", "Sample_3D", "Sample_4B", "Sample_4C", "Sample_4A", "Sample_4D"), class = "factor"),          Var2 = c(24.19, 26.6033333333333, 26.0366666666667, 27.6766666666667, 27.61, 27.5633333333333, 25.1566666666667, 33.7266666666667, 27.7, 26.1466666666667, 25.65, 26.3633333333333, 25.5333333333333, 26.1733333333333)), .Names = c("Sample", "Var2"), row.names = c(NA, -14L), class = "data.frame"), structure(list(Sample = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 9L, 11L, 12L, 13L, 14L), .Label = c("Sample_1B", "Sample_1C", "Sample_1D", "Sample_2C", "Sample_2A", "Sample_2D", "Sample_3B", "Sample_3C", "Sample_3A", "Sample_3D", "Sample_4B", "Sample_4C", "Sample_4A", "Sample_4D"), class = "factor"), Var3 = c(31.4133333333333, 35.56, 33.9666666666667, 35.66, 32.4633333333333, 31.99, 31.3133333333333, 36.34, 34.9433333333333, 34.5433333333333, 34.3766666666667, 33.28)), .Names = c("Sample", "Var3"), row.names = c(NA, -12L), class = "data.frame")) 
+3

'dput (DataList [1 : 3]) '의 출력을 제공해 주시겠습니까? – joran

+1

중복 가능한 [R : 많은 데이터 병합] 프레임 (http://stackoverflow.com/questions/14096814/r-merging-a-lot-of-data-frames) –

+1

중복 가능한 [여러 데이터 병합 프레임을 동시에 목록에] (http://stackoverflow.com/questions/8091303/merge-multiple-data-frames-in-a-list-simultaneously) –

답변

25

Reduce에 대한 교과서 사용 사례처럼 보인다.

merge.all <- function(x, y) { 
    merge(x, y, all=TRUE, by="Sample") 
} 

output <- Reduce(merge.all, DataList) 
+0

완벽, 고마워요! – phosphorelated

관련 문제