2012-01-25 33 views
5

Làm cách nào để có được tên khung dữ liệu từ danh sách? Chắc chắn, get() lấy đối tượng, nhưng tôi muốn có tên của nó để sử dụng trong một hàm khác. Đây là trường hợp sử dụng, trong trường hợp bạn muốn đề xuất một công việc xung quanh:Làm thế nào để lấy tên của một data.frame trong một danh sách?

lapply(somelistOfDataframes, function(X) { 
    ddply(X, .(idx, bynameofX), summarise, checkSum = sum(value)) 
}) 

Có một cột trong mỗi khung dữ liệu có cùng tên với khung dữ liệu trong danh sách. Làm thế nào tôi có thể nhận được tên này bynameofX? names(X) sẽ trả lại toàn bộ vectơ.

EDIT: Dưới đây là một ví dụ tái sản xuất:

df1 <- data.frame(value = rnorm(100), cat = c(rep(1,50), 
    rep(2,50)), idx = rep(letters[1:4],25)) 
df2 <- data.frame(value = rnorm(100,8), cat2 = c(rep(1,50), 
    rep(2,50)), idx = rep(letters[1:4],25)) 

mylist <- list(cat = df1, cat2 = df2) 
lapply(mylist, head, 5) 

Trả lời

4

Tôi muốn sử dụng tên của danh sách theo cách này:

dat1 = data.frame() 
dat2 = data.frame() 
l = list(dat1 = dat1, dat2 = dat2) 
> str(l) 
List of 2 
$ dat1:'data.frame': 0 obs. of 0 variables 
$ dat2:'data.frame': 0 obs. of 0 variables 

và sau đó sử dụng lapply + ddply như:

lapply(names(l), function(x) { 
    ddply(l[[x]], c("idx", x), summarise,checkSum = sum(value)) 
    }) 

Điều này vẫn chưa được kiểm tra mà không có câu trả lời có thể tái sản xuất. Nhưng nó sẽ giúp bạn đi đúng hướng.

EDIT (ran2): Đây là mã sử dụng ví dụ có thể tái sản xuất.

l <- lapply(names(mylist), function(x) { 
ddply(mylist[[x]], c("idx", x), summarise,checkSum = sum(value)) 
}) 
names(l) <- names(mylist); l 
+2

'llply (mylist, .fun = ddply, c (2, 3), tóm tắt, checkSum = tổng (giá trị)) 'hoạt động tốt, nhưng có thể khó hiểu hơn – baptiste

+0

nhưng ngắn hơn, tôi thích! –

+0

@ baptiste: điều đó có hoạt động với chỉ mục dựa trên tên không? –

0

bạn chỉ có thể trước hết là sử dụng tên (danh sách) -> LIST_NAME và sau đó sử dụng LIST_NAME [1], LIST_NAME [2] vv để có được mỗi tên trong danh sách. (Bạn cũng có thể cần as.numeric (LIST_NAME [x]) nếu tên danh sách của bạn là những con số.

1

Đây là dplyr tương đương

library(dplyr) 

catalog = 
    data_frame(
    data = someListOfDataframes, 
    cat = names(someListOfDataframes)) %>% 
    rowwise %>% 
    mutate(
    renamed = 
     data %>% 
     rename_(.dots = 
       cat %>% 
       as.name %>% 
       list %>% 
       setNames("cat")) %>% 
     list) 

catalog$renamed %>% 
    bind_rows(.id = "number") %>% 
    group_by(number, idx, cat) %>% 
    summarize(checkSum = sum(value)) 
Các vấn đề liên quan