在不使用嵌套套用的情况下在列和行上映射函数

时间:2018-11-02 16:17:07

标签: r functional-programming apply purrr

我有几个数据帧和一个像这样的向量:

set.seed(420)

df1 <- data.frame(matrix(rexp(50), nrow = 10, ncol = 5))
names(df1) <- paste0(rep("variable_", 5), 1:5)

df2 <- data.frame(matrix(rexp(50), nrow = 10, ncol = 5))
names(df2) <- paste0(rep("variable_", 5), 1:5)

vector1 <- data.frame(variable_a = rexp(10))

我想要一个函数,该函数遍历我所有3个对象的列和行。但是似乎mapplypmap都只将列作为输入,并且我必须做一个嵌套函数才能得到我想要的东西:

#function
simple_function <- function(x,y,z) {
 sum((x + y) ^ z)
}

# nested map - quite ugly
map_dfc(1:5, function(n) {
  pmap(list(df1[n], vector1, df2[n]), simple_function)
})

哪个给我所需的输出如下:

# A tibble: 1 x 5
     X1    X2    X3    X4    X5
  <dbl> <dbl> <dbl> <dbl> <dbl>
1  57.3  29.3  25.3  51.0  37.8

有没有一种方法可以重写map函数以避免嵌套?

1 个答案:

答案 0 :(得分:1)

无需映射或列表,只需对基数R中的整个对象运行算术即可。等长加法需要在rep以下进行,每列只需重复 vector1 5次。

(x + y) ^ z
...
(df1 + rep(vector1, length(df1))) ^ df2

要返回最后的列总和,请运行colSums,它是apply(..., 2, sum)的包装。但是类似于@nicola的注释,我无法从发布的值中复制所需的结果。

result <- (df1 + rep(vector1, length(df1))) ^ df2

colSums(result)
# variable_1 variable_2 variable_3 variable_4 variable_5 
#   15.08225  125.27506   13.09822   22.49251   30.75699 

apply(result, 2, sum)
# variable_1 variable_2 variable_3 variable_4 variable_5 
#   15.08225  125.27506   13.09822   22.49251   30.75699

以上等同于mapply(其中Map是其非简化包装器)。但是再次不需要元素迭代。

simple_function <- function(x,y,z) {
  sum((x + y) ^ z)
}
mapply(simple_function, df1, vector1, df2)
# variable_1 variable_2 variable_3 variable_4 variable_5 
#   15.08225  125.27506   13.09822   22.49251   30.75699

Map(simple_function, df1, vector1, df2)
# $variable_1
# [1] 15.08225

# $variable_2
# [1] 125.2751

# $variable_3
# [1] 13.09822

# $variable_4
# [1] 22.49251

# $variable_5
# [1] 30.75699