2013-08-22 37 views
5

Tôi có một khung dữ liệu lớn mà bao gồm dữ liệu mà trông giống như sau:R: lặp qua khung dữ liệu giải nén tập hợp con của dữ liệu tùy thuộc vào ngày

 date w x y z region 
1 2012 01 21 43 12 3 NORTH 
2 2012 02 32 54 21 16 NORTH 
3 2012 03 14 32 65 32 NORTH 
4 2012 04 65 33 75 21 NORTH 
:  :  : : : :  : 
:  :  : : : :  : 
12 2012 12 32 58 53 17 NORTH 
13 2012 01 12 47 43 23 SOUTH 
14 2012 02 87 43 21 76 SOUTH 
:  :  : : : :  : 
25 2012 01 12 46 84 29 EAST 
26 2012 02 85 29 90 12 EAST 
:  :  : : : :  : 
:  :  : : : :  : 

tôi muốn trích xuất phần của dữ liệu mà có cùng một giá trị date, ví dụ để làm điều này chỉ dành riêng cho 2012 01 tôi chỉ sẽ tạo ra một tập hợp con của dữ liệu

data_1 <- subset(data, date == "2012 01") 

và điều này mang lại cho tôi tất cả các dữ liệu cho 2012 01 nhưng sau đó tôi tiếp tục áp dụng một chức năng để dữ liệu này. Tôi muốn có thể áp dụng chức năng của mình cho tất cả các tập con dữ liệu, vì vậy, lý tưởng là tôi sẽ lặp qua khung dữ liệu lớn và trích xuất dữ liệu cho 2012 01, 2012 02, 2012 03, 2012 04... và áp dụng một hàm cho từng tập con dữ liệu riêng biệt.

Nhưng tôi muốn có thể áp dụng điều này vào khung dữ liệu ngay cả khi chiều dài khung dữ liệu của tôi thay đổi, vì vậy có thể không phải lúc nào cũng đi từ 2012 01 - 2012 12, phạm vi ngày có thể thay đổi. trên dữ liệu từ ví dụ 2011 03 - 2013 01.

Trả lời

9

là những gì bạn muốn? df_list <- split(data, as.factor(data$date))

+0

điều này là hoàn hảo! Câu trả lời đơn giản như vậy cho một thứ tôi nghĩ sẽ phức tạp hơn nhiều, cảm ơn bạn – userk

0

Bạn có thể chia của bạn data.frame thành một list của data.frames như thế này:

list.of.dfs<-by(data,data$date) 
+0

dường như không hoạt động. thiếu tham số FUN cho by() –

0

Đây là một tình huống hoàn hảo cho gói plyr:

require(plyr) 
ddply(my_df, .(date), my_function, extra_arg_1, extra_arg_2) 

nơi my_function là chức năng bạn muốn để thực hiện trên các khung dữ liệu tách và extra_arg s là bất kỳ đối số bổ sung nào cần phải đi đến hàm đó.

ddply (d khung ata ->d khung ata) là biểu mẫu bạn muốn nếu bạn muốn kết quả trong khung dữ liệu; dlply trả về một danh sách.

14

Lặp qua từng ngày duy nhất và tạo tập hợp con.

uniq <- unique(unlist(data$Date)) 
for (i in 1:length(uniq)){ 
    data_1 <- subset(data, date == uniq[i]) 
    #your desired function 
} 
+0

Tôi thực sự thích câu trả lời này, cảm ơn bạn – userk

+0

Mỗi tập hợp con có một tên duy nhất không? Từ những gì tôi thấy bạn sẽ kết thúc đưa mỗi tập con trong một khung dữ liệu. Thx – BlackHat

+0

không có vòng lặp nào sẽ ghi đè lên 'dữ liệu_1' và sau đó người dùng có thể áp dụng bất kỳ chức năng nào cho khung dữ liệu và tự chọn vị trí lưu trữ kết quả. – TylerDurden

2

Sau tiểu thiết lập bộ dữ liệu của bạn theo ngày, tưởng tượng rằng các chức năng mà bạn muốn áp dụng cho mỗi nhóm là tìm giá trị trung bình của cột x. Bạn có thể làm theo cách này: (df là khung dữ liệu của bạn)

library(plyr) 
ddply(df, .(date), summarize, mean = mean(x)) 
Các vấn đề liên quan