2012-03-15 40 views
35

Tôi đang cố gắng tạo riêng các đối tượng data.frame dựa trên các mức của một yếu tố. Vì vậy, nếu tôi có:Chia dữ liệu.bảng dựa trên các mức của một yếu tố thành dữ liệu mới.frames

df <- data.frame(
    x=rnorm(25), 
    y=rnorm(25), 
    g=rep(factor(LETTERS[1:5]), 5) 
) 

làm thế nào tôi có thể chia nhỏ df vào riêng biệt data.frame s cho mỗi cấp độ của g chứa tương ứng xy giá trị? Tôi có thể nhận được hầu hết các cách có sử dụng split(df, df$g), nhưng tôi muốn mỗi cấp độ của các yếu tố để có riêng của mình data.frame. Cách tốt nhất để làm điều này là gì?

Cảm ơn.

+0

bạn có thể giải thích những gì là sai với 'chia (df, df $ g)'? Nó trả về một danh sách 'data.frame', một cho mỗi giá trị' g'. –

Trả lời

70

Tôi nghĩ rằng split thực hiện chính xác những gì bạn muốn.

ý rằng X là một danh sách các khung dữ liệu, như được thấy bởi str:

X <- split(df, df$g) 
str(X) 

Nếu bạn muốn đối tượng cá nhân với tên g nhóm bạn có thể gán các phần tử của X từ split các đối tượng của những tên , mặc dù điều này có vẻ như thêm công việc khi bạn chỉ có thể lập chỉ mục các khung dữ liệu từ danh sách split tạo.

#I used lapply just to drop the third column g which is no longer needed. 
Y <- lapply(seq_along(X), function(x) as.data.frame(X[[x]])[, 1:2]) 

#Assign the dataframes in the list Y to individual objects 
A <- Y[[1]] 
B <- Y[[2]] 
C <- Y[[3]] 
D <- Y[[4]] 
E <- Y[[5]] 

#Or use lapply with assign to assign each piece to an object all at once 
lapply(seq_along(Y), function(x) { 
    assign(c("A", "B", "C", "D", "E")[x], Y[[x]], envir=.GlobalEnv) 
    } 
) 

Sửa Hoặc thậm chí tốt hơn so với sử dụng lapply để gán cho môi trường toàn cầu sử dụng list2env:

names(Y) <- c("A", "B", "C", "D", "E") 
list2env(Y, envir = .GlobalEnv) 
A 
+0

Cảm ơn. Đó là việc tách từng 'data.frame' được tạo ra bằng cách sử dụng' split' thành từng đối tượng riêng biệt mà tôi gặp khó khăn. Điều này thật đúng với gì mà tôi đã tìm kiếm. – smillig

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