2012-01-04 38 views
14

Giả sử tôi có một chức năng tạo khung dữ liệu. Tôi muốn chạy hàm đó với các giá trị đầu vào khác nhau và sau đó rbind kết quả lại với nhau thành một khung dữ liệu lớn, như sau:Buộc phải trả lại một danh sách?

CreateDataFrame <- function(type="A", n=10, n.true=8) { 
    data.frame(success=c(rep(TRUE, n.true), rep(FALSE, n - n.true)), type=type) 
} 
df <- do.call(rbind, lapply(toupper(letters[1:5]), CreateDataFrame)) 

Hàm CreateDataFrame của tôi có ba đối số. Trong ví dụ trên, các đối số thứ hai và thứ ba được giữ không đổi. Tôi muốn làm tương tự như trên, nhưng có đối số thứ hai và thứ ba thay đổi trên mỗi cuộc gọi. Tôi nghĩ rằng tôi phải sử dụng mapply, như thế này:

mapply("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4) 

Tôi đang gặp rắc rối vì mapply không trả về một danh sách, mà ngăn cản tôi chạy do.call(rbind, mapply(...)). Làm thế nào tôi có thể kết thúc với một khung dữ liệu duy nhất, như tôi đã làm trong ví dụ ở đầu trang?

Có vẻ như đang trả về một ma trận danh sách. Tôi đã hy vọng nó sẽ trả về một danh sách các khung dữ liệu. Tôi nên làm gì khác?

Trả lời

23

Để nhận danh sách dữ liệu.frames làm giá trị trả về, hãy đặt đối số mapply 's SIMPLIFY thành FALSE. (Giá trị mặc định của nó là TRUE, chỉ thị hàm này "cố gắng giảm kết quả thành mảng vectơ, ma trận hoặc chiều cao" - chỉ là những gì bạn đã trải nghiệm).

res <- mapply("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4, 
       SIMPLIFY = FALSE) 

identical(class(res), "list") 
[1] TRUE 
+2

Cảm ơn bạn! Nhìn lại, tôi nên đọc hướng dẫn kỹ hơn. – Adrian

+3

Không sao cả. Phải mất một thời gian trước khi tôi biết rằng bất cứ khi nào tôi thấy mình nghĩ "sẽ không tốt đẹp nếu hàm X đã làm Y", có một cơ hội tốt mà người tạo ra chức năng đã đánh tôi với suy nghĩ đó! –

+7

nó rất câm mà đơn giản hóa cần phải ở thủ đô. Hình thức của nó không phù hợp với chức năng nhóm sapply – adam

4

Thay thế bạn có thể sử dụng chức năng Bản đồ. Về cơ bản, nó là một cách đơn giản với SIMPLIFY được đặt thành FALSE.

Map("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4) 
+0

cũng như thế nào về điều đó. Học điều mới mỗi ngày – theforestecologist

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