我想将一个函数元素应用于数据框列表。我可以应用一个简单的函数,但不能应用更复杂的函数,因为我不确定如何引用这些参数。
我可以对数据框执行以下操作:
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)
答案 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