2013-06-18 38 views
12

Tôi có một biến thể của vấn đề oh-so-chung làm thế nào để kết hợp với nhau trong điều R.R - sáp nhập một danh sách các khung dữ liệu vào một khung dữ liệu với các giá trị thiếu bằng hàng

Tôi có một bộ file .txt trong một thư mục cụ thể, và tôi đã viết một hàm:

  • tạo ra một danh sách các tập tin mà tôi muốn, và sau đó cho mỗi tập tin
  • đọc file
  • tập con dữ liệu (để chỉ trích xuất các hàng và cột quan tâm)
  • thực hiện một số phép tính trên dữ liệu
  • thêm các giá trị mới này vào danh sách.

Những gì tôi kết thúc với một danh sách với cấu trúc sau:

>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 với mỗi biến (Var1, Var2, Var3, ...) Tôi có một cột Sample và một cột của giá trị số.

Sample luôn là yếu tố có 14 cấp độ; các mức này giống nhau cho mỗi biến.

Vấn đề là một số biến (như Var3 ở trên) không có quan sát cho từng cấp độ Sample.

Điều tôi muốn kết thúc là một khung dữ liệu với 14 hàng (một cho mỗi cấp độ Sample). Cột đầu tiên phải là Sample; sau đó cho mỗi biến, cần có một cột chứa các giá trị số tương ứng, như vậy:

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 

Tôi đã cố gắng để làm điều này với do.call, nhưng không biết làm thế nào để vượt qua các đối số cho by; cbind không hài lòng vì thiếu các giá trị. Bất kỳ suy nghĩ về cách làm điều này?

Cảm ơn!

EDIT: Theo yêu cầu của Joran của:

>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

Bạn có thể vui lòng cung cấp đầu ra của 'dput (DataList [1: 3])' không? – joran

+1

bản sao có thể có của [R: hợp nhất nhiều dữ liệu.frames] (http://stackoverflow.com/questions/14096814/r-merging-a-lot-of-data-frames) –

+1

có thể trùng lặp của [Hợp nhất nhiều dữ liệu các khung trong danh sách cùng một lúc] (http://stackoverflow.com/questions/8091303/merge-multiple-data-frames-in-a-list-simaneously) –

Trả lời

25

Trông giống như một trường hợp sử dụng sách giáo khoa cho Reduce.

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

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

Hoàn hảo, cảm ơn bạn! – phosphorelated

Các vấn đề liên quan