2011-01-25 46 views
8

Tôi có 4 khung dữ liệu chứa cột ngày, cột giá và cột trả về.Áp dụng một chức năng cho mỗi khung dữ liệu

data.1:

Date  Price Return 
2009-01-02 100 0.2 
2009-01-03 110 0.1 
etc. 

data.2:

Date  Price Return 
2009-02-02 60 0.15 
2009-02-03 50 -0.1 
etc. 

tôi muốn thiết lập một vòng lặp và áp dụng mật độ function() cho mỗi khung dữ liệu, trở về các giá trị mật độ cho lợi nhuận.

tôi thông qua về việc tạo ra một danh sách, thiết lập một vòng lặp và sử dụng lapply() để thực hiện điều này, vì vậy

> ff <- list(data.1, data.2, data.3, data.4) 
> for(i in 1:length(ff){ 
     density[[i]] <- lapply(ff, density(ff[[i]]$Return))} 

nhưng điều này rõ ràng là không hoạt động. Ai đó có thể giúp tôi một chút được không?

Cảm ơn trước - Dani

Trả lời

10

Trước tiên, bạn nên khởi tạo mật độ nếu bạn muốn làm điều đó gán bằng tay.

densities <- list() 

Thứ hai, bạn sử dụng hàm mật độ một cách hài hước. Bạn nên chỉ định các chức năng khác nhau trong lapply của bạn. Hoặc là bạn cung cấp hàm và các đối số thừa sau dấu phẩy hoặc bạn xây dựng hàm nhỏ tùy chỉnh của riêng mình trong cuộc gọi lapply, như được hiển thị bên dưới.

data.1 <- data.frame(
    X1 = letters[1:10], 
    X2 = 1:10 
) 

data.2 <- data.frame(
    X1 = letters[11:20], 
    X2 = 10:1 
) 

ff <- list(data.1,data.2) 

densities <- lapply(ff,function(i) {density(i$X2)}) 

Điều này sẽ tự động trả về danh sách.

Để lấy dữ liệu ra khỏi nó, bạn chỉ cần sử dụng các chỉ số danh sách:

densities[[1]]$x 

Nếu bạn đặt tên danh sách của bạn trước đây, bạn có thể sử dụng các tên cũng như:

names(ff) <- c("data.1","data.2") 

densities <- lapply(ff,function(i) {density(i$X2)}) 
densities[['data.1']]$x 
+0

Xin lỗi tôi không hiểu. Mật độ của một giá trị nào? – Dani

+0

@Dani: xin lỗi, lỗi của tôi, tôi đã đọc sai –

+0

Không sao cả, cảm ơn giải pháp. Nó hoạt động tốt! Tôi có một câu hỏi còn lại: bây giờ tôi có thể truy cập vào các giá trị mà mật độ() được tính như thế nào? Vì vậy, ví dụ, tôi muốn chỉ chọn x-giá trị (mà sẽ là lợi nhuận) của những gì mật độ tính cho tôi. Mật độ [[1]] chỉ chọn kết quả cho dữ liệu.1. Làm thế nào bây giờ tôi có thể chọn chỉ các giá trị x nội suy của dữ liệu.1? mật độ [[1 $ x]] không hoạt động ... – Dani

3

Điều với lapply là bạn không cần phải sử dụng một for-loop. Điều này sẽ hoạt động:

data.1=data.2=data.3=data.4=matrix(rnorm(30),ncol=3) 

ff=list(data.1,data.2,data.3,data.4) 

densities=lapply(ff,function(x)density(x[,3])) 

Mặc dù chắc chắn có cách tốt hơn để thực hiện việc này (có nghĩa là phân công thủ công danh sách).

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