Примените функцию к каждому элементу каждого фрейма данных в списке - PullRequest
2 голосов
/ 27 сентября 2019

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

Я могу выполнить следующее действие для фрейма данных:

df1 <- data.frame(
  A = c(1, 2),
  B = c(1, 3)
)
centered <- apply(df1, 2, function(x) x - mean(x)) 
scaled <- apply(centered, 2, function(x) x/sqrt(sd(x)))

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

df1 <- data.frame(
      A = c(1, 2),
      B = c(1, 3))
 df2 <- data.frame(
      A = c(1, 2, 3, 4),
      B = c(1, 2, 3, 4))
 l=list(df1,df2)

Я узнал, что mapply, кажется, выполняет то, что я хочу.Но как применить действия сверху?Вот отображение для функции (x, y).Я хотел бы применить действия centered и scaled сверху вместо:

l_output <- mapply(function(x,y) x*y, x = 2, y = list, SIMPLIFY = FALSE)

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Применить те же функции, используя lapply.Это касается как центрированной, так и масштабированной функции вместе.

lapply(l, function(y) apply(y, 2, function(x) {
        x = x - mean(x)
        x/sqrt(sd(x))
}))

#[[1]]
#              A          B
#[1,] -0.5946036 -0.8408964
#[2,]  0.5946036  0.8408964

#[[2]]
#              A          B
#[1,] -1.3201676 -1.3201676
#[2,] -0.4400559 -0.4400559
#[3,]  0.4400559  0.4400559
#[4,]  1.3201676  1.3201676

Если вы хотите их отдельно

centered <- lapply(l, function(y) apply(y, 2, function(x) x - mean(x)))
scaled <- lapply(centered, function(y) apply(y, 2, function(x) x/sqrt(sd(x))))
0 голосов
/ 27 сентября 2019

Один из вариантов: purrr::map для итерации по фреймам данных и dplyr::mutate_all для применения функции ко всем столбцам в каждом фрейме данных.

purrr::map(l, function(d) {
  dplyr::mutate_all(d, function(x) {
    x <- x - mean(x)
    x / sqrt( sd(x) )
  })
})
#> [[1]]
#>            A          B
#> 1 -0.5946036 -0.8408964
#> 2  0.5946036  0.8408964
#> 
#> [[2]]
#>            A          B
#> 1 -1.3201676 -1.3201676
#> 2 -0.4400559 -0.4400559
#> 3  0.4400559  0.4400559
#> 4  1.3201676  1.3201676

Или, если вы объявите эту функцию, вы можете сделать это в одной строке:

center_and_scale <- function(x) {
  x <- x - mean(x)
  x / sqrt( sd(x) )
}

purrr::map(l, dplyr::mutate_all, center_and_scale)
# same output
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...