将功能应用于列表中每个数据框的每个元素

时间:2019-09-26 23:33:00

标签: r list function

我想将一个函数元素应用于数据框列表。我可以应用一个简单的函数,但不能应用更复杂的函数,因为我不确定如何引用这些参数。

我可以对数据框执行以下操作:

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)的映射。我想从上方应用动作centeredscaled

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

2 个答案:

答案 0 :(得分:1)

使用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))))

答案 1 :(得分:0)

一个选项是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