2011-11-02 38 views
21

Tôi đang làm việc trên một dự án ngay bây giờ, nơi tôi đã dần dần tích lũy một loạt các biến khác nhau từ một loạt các nguồn khác nhau. Là một người hơi thông minh, tôi đã tạo một thư mục con khác cho mỗi thư mục dưới thư mục "original_data" chính và bao gồm tệp .txt có URL và các bộ mô tả khác về nơi tôi nhận dữ liệu. Là một người không đủ thông minh, các tệp .txt này không có cấu trúc.Tài liệu tự động về các tập dữ liệu

Bây giờ tôi đang phải đối mặt với nhiệm vụ biên dịch một phần phương pháp mà tài liệu tất cả các nguồn dữ liệu khác nhau. Tôi sẵn sàng trải qua và thêm cấu trúc vào dữ liệu, nhưng sau đó tôi sẽ cần tìm hoặc xây dựng một công cụ báo cáo để quét qua các thư mục và trích xuất thông tin.

Điều này có vẻ giống như một cái gì đó mà ProjectTemplate đã có, nhưng tôi dường như không thể tìm thấy chức năng đó ở đó.

Công cụ như vậy có tồn tại không?

Nếu không, những cân nhắc nào cần được tính đến để mang lại sự linh hoạt tối đa? Vài suy nghĩ ban đầu: (? YAML)

  1. Một ngôn ngữ đánh dấu nên được sử dụng
  2. Tất cả các thư mục con nên được quét
  3. Để tạo điều kiện (2), một phần mở rộng tiêu chuẩn cho một mô tả dữ liệu nên được sử dụng
  4. Điều quan trọng là, để làm điều này hữu ích nhất, cần phải có cách nào đó để phù hợp với các bộ mô tả biến với tên mà chúng cuối cùng sẽ tiếp tục. Do đó, tất cả việc đổi tên các biến phải được thực hiện trong các tệp nguồn chứ không phải trong bước làm sạch (ít hơn lý tưởng), một số phân tích mã phải được thực hiện bởi công cụ tài liệu để theo dõi các thay đổi tên biến (ugh!), Hoặc một số lai đơn giản hơn như cho phép đổi tên biến được chỉ định trong tệp đánh dấu nên được sử dụng.
  5. Lý tưởng nhất là báo cáo cũng được tạo khuôn mẫu (ví dụ: "Chúng tôi đã lấy biến [var] từ tập dữ liệu [dset] vào [date].") Và có thể được liên kết với Sweave.
  6. Công cụ phải đủ linh hoạt để không quá nặng nề. Điều này có nghĩa là tài liệu tối thiểu chỉ đơn giản là tên tập dữ liệu.
+1

một vài suy nghĩ. một, bạn nên xem 'roxygen2' để ghi lại các tập dữ liệu. hai, nó khá dễ dàng để khái quát hóa 'ProjectTemplate' để làm những gì bạn tìm kiếm, và tôi đang làm việc trên một bằng chứng về khái niệm, mà tôi sẽ đăng trên' github' ngay. – Ramnath

+0

@Ramnath Cảm ơn. Âm thanh tuyệt vời. Tôi đã quên 'roxygen2' hoạt động cho các tập dữ liệu, vì vậy tôi sẽ đưa ra một cái nhìn. Bạn có một định dạng tài liệu được viết ở đâu đó, ngay cả khi trình phân tích cú pháp không được thực hiện, để tôi có thể tránh viết lại khi bằng chứng khái niệm của bạn xuất hiện? –

+0

Tôi không làm việc trên một định dạng tài liệu mới. 'roxygen2' là đủ cho hầu hết các yêu cầu về tài liệu. Ý tưởng tôi đang làm là cho phép 'roxygen' được chạy trên các thư mục tùy ý, để nó có thể được sử dụng với một' dự án' không phải là một gói 'R'. – Ramnath

Trả lời

17

Đây là câu hỏi rất hay: mọi người nên rất quan tâm đến tất cả các chuỗi thu thập dữ liệu, tổng hợp, chuyển đổi, v.v ..., tạo thành cơ sở cho kết quả thống kê. Thật không may, điều này không được thực hiện rộng rãi.

Trước khi giải quyết các câu hỏi của bạn, tôi muốn nhấn mạnh rằng điều này có vẻ khá liên quan đến mục tiêu chung về quản lý xuất dữ liệu. Tôi cũng có thể cung cấp cho bạn Google link để đọc thêm. :) Có rất nhiều tài nguyên mà bạn sẽ tìm thấy, chẳng hạn như khảo sát, công cụ phần mềm (ví dụ: một số công cụ được liệt kê trong mục nhập Wikipedia), các dự án nghiên cứu khác nhau (ví dụ: Provenance Challenge) và hơn thế nữa.

Đó là một sự khởi đầu khái niệm, bây giờ để giải quyết các vấn đề thực tiễn:

Tôi đang làm việc trên một dự án ngay bây giờ mà tôi đã dần dần tích lũy một loạt các biến số khác nhau từ một loạt các nguồn khác nhau. Là một người hơi thông minh, tôi đã tạo một thư mục con khác cho mỗi thư mục dưới thư mục "original_data" chính và bao gồm tệp .txt có URL và các bộ mô tả khác về nơi tôi nhận dữ liệu. Là một người không đủ thông minh, các tệp .txt này không có cấu trúc.

Chào mừng đến với cơn ác mộng của mọi người. :)

Bây giờ tôi phải đối mặt với nhiệm vụ biên dịch một phần phương thức ghi lại tất cả các nguồn dữ liệu khác nhau. Tôi sẵn sàng trải qua và thêm cấu trúc vào dữ liệu, nhưng sau đó tôi sẽ cần tìm hoặc xây dựng một công cụ báo cáo để quét qua các thư mục và trích xuất thông tin.

Không sao cả. list.files(...,recursive = TRUE) có thể trở thành một người bạn tốt; xem thêm listDirectory() trong R.utils.

Cần lưu ý rằng việc điền vào phần phương thức trên nguồn dữ liệu là một ứng dụng hẹp trong xuất xứ dữ liệu. Trong thực tế, nó là khá đáng tiếc rằng CRAN Task View on Reproducible Research chỉ tập trung vào tài liệu. Mục đích của dữ liệu xuất xứ là, theo kinh nghiệm của tôi, một tập hợp con của nghiên cứu tái sản xuất, và tài liệu của thao tác dữ liệu và kết quả là một tập hợp con của dữ liệu xuất xứ. Vì vậy, quan điểm nhiệm vụ này vẫn còn trong giai đoạn trứng nước về nghiên cứu tái sản xuất. Nó có thể hữu ích cho mục tiêu của bạn, nhưng cuối cùng bạn sẽ vượt qua nó. :)

Công cụ này có tồn tại không?

Có. Các công cụ này là gì? Mon dieu ... nó rất tập trung vào ứng dụng nói chung. Trong R, tôi nghĩ rằng những công cụ này không được chú ý nhiều (* xem bên dưới). Điều đó khá đáng tiếc - hoặc là tôi đang thiếu một cái gì đó, hoặc người nào khác cộng đồng R đang thiếu một cái gì đó mà chúng ta nên sử dụng.

Đối với quy trình cơ bản mà bạn đã mô tả, tôi thường sử dụng JSON (xem this answerthis answer để nhận xét về những gì tôi đang làm). Đối với phần lớn công việc của tôi, tôi đại diện cho điều này như là một "mô hình lưu lượng dữ liệu" (thuật ngữ đó có thể không rõ ràng, đặc biệt trong ngữ cảnh của máy tính, nhưng ý tôi là từ quan điểm phân tích thống kê). Trong nhiều trường hợp, luồng này được mô tả qua JSON, do đó không khó để trích xuất chuỗi từ JSON để giải quyết các kết quả cụ thể phát sinh như thế nào.

Đối với các dự án phức tạp hoặc được điều chỉnh, JSON không đủ và tôi sử dụng cơ sở dữ liệu để xác định cách dữ liệu được thu thập, chuyển đổi, v.v. để đảm bảo rằng dữ liệu xuất xứ là tài liệu. Tôi nghi ngờ rằng loại DB là vượt quá xa sự quan tâm của bạn, vì vậy hãy di chuyển trên ...

1. Một ngôn ngữ đánh dấu nên được sử dụng (YAML?)

Thẳng thắn mà nói, bất cứ điều gì bạn cần để mô tả lưu lượng dữ liệu của bạn sẽ đầy đủ. Hầu hết thời gian, tôi thấy nó đủ để có JSON tốt, bố cục thư mục dữ liệu tốt và sắp xếp tốt các tập lệnh.

2. Tất cả các thư mục con nên được quét

Done: listDirectory()

3. Để tạo điều kiện (2), một phần mở rộng tiêu chuẩn cho một mô tả dữ liệu nên được sử dụng

tầm thường: ".json". ;-) Hoặc ".SecretSauce" cũng hoạt động.

4. Điều quan trọng là, để làm điều này hữu ích nhất cần phải có cách nào đó để phù hợp với các bộ mô tả biến với tên mà cuối cùng chúng mang về. Do đó, tất cả việc đổi tên các biến phải được thực hiện trong các tệp nguồn chứ không phải trong bước làm sạch (ít hơn lý tưởng), một số phân tích mã phải được thực hiện bởi công cụ tài liệu để theo dõi các thay đổi tên biến (ugh!), Hoặc một số lai đơn giản hơn như cho phép đổi tên biến được chỉ định trong tệp đánh dấu nên được sử dụng.

Như đã nêu, điều này không hoàn toàn hợp lý. Giả sử tôi lấy var1var2 và tạo var3var4. Có lẽ var4 chỉ là ánh xạ của var2 với các số lượng của nó và var3 là cực đại quan sát của var1var2; hoặc tôi có thể tạo var4 từ var2 bằng cách cắt bớt các giá trị cực đoan. Nếu tôi làm như vậy, tôi có giữ lại tên của var2 không? Mặt khác, nếu bạn đang đề cập đến việc chỉ khớp "tên dài" với "tên đơn giản" (tức là mô tả văn bản cho biến R), thì đây là điều mà bạn chỉ có thể làm. Nếu bạn có dữ liệu rất có cấu trúc, không khó để tạo danh sách các tên văn bản khớp với tên biến; cách khác, bạn có thể tạo mã thông báo có thể thực hiện thay thế chuỗi. Tôi không nghĩ rằng thật khó để tạo một CSV (hoặc, tốt hơn, JSON ;-)) phù hợp với tên biến cho bộ mô tả. Chỉ cần tiếp tục kiểm tra xem tất cả các biến có chuỗi mô tả phù hợp hay không và dừng lại khi đã xong.

5. Lý tưởng nhất là báo cáo cũng được tạo khuôn mẫu (ví dụ: "Chúng tôi đã lấy biến [var] từ tập dữ liệu [dset] vào [ngày].") Và có thể được liên kết với Sweave.

Đó là nơi các đề xuất của người khác về roxygenroxygen2 có thể áp dụng.

6. Công cụ phải đủ linh hoạt để không quá nặng nề. Điều này có nghĩa là tài liệu tối thiểu chỉ đơn giản là tên tập dữ liệu.

Hmm, tôi bị chặn ở đây. :)

(*) Nhân tiện, nếu bạn muốn một dự án FOSS liên quan đến điều này, hãy xem Taverna. Nó đã được integrated with R như được ghi lại ở một số nơi. Điều này có thể là quá mức cần thiết cho nhu cầu của bạn tại thời điểm này, nhưng nó đáng để nghiên cứu như một ví dụ về một hệ thống quy trình làm việc chín chắn.


Lưu ý 1: Vì tôi thường sử dụng bigmemory cho các tập dữ liệu lớn, tôi phải đặt tên cho các cột của mỗi ma trận. Chúng được lưu trữ trong một tệp mô tả cho mỗi tệp nhị phân. Quá trình đó khuyến khích việc tạo ra các mô tả phù hợp với các tên biến (và ma trận) cho các bộ mô tả. Nếu bạn lưu trữ dữ liệu của mình trong cơ sở dữ liệu hoặc các tệp bên ngoài khác hỗ trợ quyền truy cập ngẫu nhiên và nhiều quyền truy cập R/W (ví dụ: tệp được ánh xạ bộ nhớ, tệp HDF5, bất kỳ tệp nào nhưng .rdat), bạn có thể thấy rằng việc thêm mô tả trở thành bản chất thứ hai.

+0

+1 Câu trả lời hay. Tôi sẽ thêm JSON vào danh sách những điều cần tìm hiểu. – Andrie

+0

@Andrie Điều thú vị là bạn không có nhiều thứ để học! Bạn đã biết danh sách của R, mà tôi tin rằng, cung cấp một superset khả năng JSON (người ta có thể cho rằng chúng có thể là đẳng cấu, tôi không chắc chắn). Kiểm tra bản demo nhỏ của tôi trong [câu trả lời này] (http://stackoverflow.com/questions/6437213/strategies-for-repeating-large-chunk-of-analysis/6550914#6550914). Sẽ mất khoảng 3-5 phút để tìm hiểu mọi thứ bạn cần biết bằng cách chỉ cần thử 'fromJSON' và' toJSON', là phần I/O, vì bạn đã biết danh sách và lồng ghép danh sách. Mọi thứ được chuyển đổi thành danh sách. – Iterator

+0

(Tiếp theo) Nhìn vào các tùy chọn cho 'fromJSON' rất hữu ích vì bạn có thể học cách tạo các vectơ có tên, một la' c (Tom = "mèo", Jerry = "chuột") '. Chỉ có dấu hiệu là 'TRUE' và' FALSE' được lưu trữ trong JSON ở dạng chữ thường của chúng. – Iterator

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