Применить функцию к каждому фрейму данных - PullRequest
9 голосов
/ 25 января 2011

У меня есть 4 фрейма данных, которые содержат столбец даты, столбец цены и столбец возврата.

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.

Я хотел бы настроить цикл и применить функцию плотность () к каждому фрейму данных, возвращая значения плотности для возвращаемых значений.

Я расскажу о создании списка, настройке цикла идля этого используется lapply (), поэтому

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

, но это, очевидно, не работает.Может ли кто-нибудь предложить мне помощь?

Заранее спасибо - Дани

Ответы [ 2 ]

12 голосов
/ 25 января 2011

Во-первых, вы должны инициализировать плотность, если вы хотите сделать это ручное назначение.

densities <- list()

Во-вторых, вы используете забавную функцию плотности. Вы должны указать другую функцию в вашем приложении. Либо вы задаете функцию и дополнительные аргументы после запятой, либо вы создаете свою собственную небольшую функцию в вызове lapply, как показано ниже.

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)})

Возвращает список автоматически.

Чтобы извлечь из него данные, просто используйте индексы списка:

densities[[1]]$x

Если вы назвали свой список раньше, вы также можете использовать имена:

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

densities <- lapply(ff,function(i) {density(i$X2)})
densities[['data.1']]$x
3 голосов
/ 25 января 2011

Проблема с lapply в том, что вам не нужно использовать цикл for.Это должно работать:

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]))

Хотя, несомненно, есть лучший способ сделать это (я имею в виду ручное назначение списка).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...