2013-01-15 33 views
5

Tôi muốn tạo một dòng dữ liệu theo hàng, bằng cách sử dụng một số hương vị của apply trên danh sách các giá trị và hàm trả về một khung dữ liệu một hàng cho mỗi giá trị. Như một ví dụ đồ chơi, giả sử rằng giá trị của tôi là i = 1:3 và rằng tôi có:Cách sử dụng áp dụng để tạo hàng khung dữ liệu theo hàng?

f <- function(i) { 
    return(data.frame(img=letters[i], cached=F, i=i, stringsAsFactors=F)) 
} 

Tôi đã rối tung xung quanh với sapply, lapply, một loạt các chuyển vị, vv không thành công (ví dụ, d = sapply(1:3, f) trông đầy hứa hẹn , nhưng dường như là sự chuyển đổi của những gì tôi muốn, vì vậy tôi đã thử d = t(sapply(1:3,f)), ngoại trừ nó là ma trận, do đó tôi đã thử , xuất hiện ngay (nó in ra giống như những gì tôi muốn), nhưng vẫn sai , như bạn sẽ tìm ra nếu bạn cố gắng để tập hợp nó, ví dụ: d[,1] thực tế là một danh sách).

Cuối cùng tôi nhận được điều này, mà làm việc:

d = apply(data.frame(i=1:3), 2, f)$i 

Điều đó mang lại cho tôi những khung Tôi muốn:

img cached i 
1 a FALSE 1 
2 b FALSE 2 
3 c FALSE 3 

Có một/cách sạch tốt hơn để diễn tả ở trên không? Tất cả đều cảm thấy khá kludgy và quá phức tạp với tôi.


Sửa: như đã đề cập bởi nhiều độc giả, điều này "đồ chơi ví dụ" là admitedly quá đơn giản, và thực sự chỉ f(1:3) sẽ làm những gì có vẻ như tôi đang yêu cầu. Hàm thực tế là một phần của bảng điều khiển chỉ số dựa trên web, thu thập dữ liệu từ các bảng DB khác nhau và tạo các ô phức tạp vừa phải mà tôi dự định lưu vào bộ nhớ cache (phần lớn thời gian chúng thay đổi tương đối chậm). Một phần liên quan, tôi đoán, là chức năng thường mất một số đối số, và những đối số không phải là một chuỗi đơn giản 1:n. Vì vậy, hãy để tôi viết lại ví dụ để có một chút thực tế hơn:

library(digest) 
gkey <- function(...) { 
    args <- list(...) 
    return(digest(paste(args,sep=".",collapse="."))); 
} 

f <- function(conn, table, checknew.query, plot.query, plot.fun, params) { 
    latest.data = queryExec(conn, table, checknew.query, params) 
    key = gkey(table, latest.data, plot.query, plot.fun, params) 
    out = getFromCacheOrPlot(key, conn, table, plot.query, plot.fun, params) 
    return(out) 
} 

nơi queryExec xây dựng một truy vấn, thực hiện nó và lấy kết quả, gkey() tính một chìa khóa băm dựa trên các thông số của nó, getFromCacheOrPlot() sử dụng key để xây dựng tên tệp (hình ảnh .png), truy xuất nó từ bộ nhớ cache nếu nó tồn tại hoặc tạo ra nó theo cách khác. Nó cũng trả về một data.frame với một hàng cho chúng ta tên tập tin, một html <img=...> blurb để hiển thị nó, cho dù cốt truyện là vào hoặc ra khỏi bộ nhớ cache, và tham số nào được sử dụng cho cốt truyện.

Tất cả điều này được sử dụng trong plugin cho hệ thống wiki và một số trang nhất định có hàng tá ô hoặc nhiều trang.

+3

'làm. cuộc gọi (rbind, lapply (i, f)) 'sẽ làm những gì bạn đang yêu cầu ... nhưng như vậy sẽ' data.frame (img = chữ cái [i], cache = F, i = i, stringsAsFactors = F) ' ... vì vậy tôi đoán tôi không chắc bạn đang hỏi gì. – Justin

+0

Tôi nghĩ bạn cần một ví dụ đồ chơi thể hiện chính xác hơn vấn đề thực sự của bạn, vì phản ứng ngay lập tức của tôi sẽ đơn giản là 'data.frame (img = letters [i], cache = rep (FALSE, length (i)), i = i) 'và tôi đoán đó không phải là những gì bạn đang theo đuổi. – joran

+0

hoặc, vì bạn đã thực hiện chức năng 'f':' f (i) 'cũng sẽ tạo ra tệp dữ liệu. – Justin

Trả lời

8

do.call(rbind, lapply(i, f)) sẽ làm những gì bạn đang yêu cầu ... nhưng như vậy sẽ:

data.frame(img=letters[i], cached=F, i=i, stringsAsFactors=F) 

Như sẽ:

f(i) 
+4

Hoặc sử dụng 'plyr :: ldply (i, f)' – hadley

+0

Tôi cũng có thể, Hadley, vì tôi đã sử dụng plyr và ggplot trên tất cả các mã tạo ra các lô thực tế ... –

+0

Hugely hữu ích và thanh lịch –

3

Điều này thì sao? Không cần phải sử dụng bất kỳ hương vị của apply chức năng

foo <- function(x){ 
    i <- seq_len(x) 
    data.frame(img=letters[i], cached=FALSE, i=i, stringsAsFactors=F) 
} 


    foo(5) 
    img cached i 
1 a FALSE 1 
2 b FALSE 2 
3 c FALSE 3 
4 d FALSE 4 
5 e FALSE 5 
+0

Xin lỗi nhưng đó không phải là những gì tôi theo sau. Như đã nêu trong các nhận xét của tôi ở trên, ví dụ đồ chơi quá đơn giản; Tôi sẽ nhắc lại câu hỏi của mình. –

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