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

R 在不使用嵌套应用的情况下在列和行上映射函数,r,functional-programming,apply,purrr,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),

我有两个数据帧和一个向量,如下所示:

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))
这为我提供了如下所需的输出:

# 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
#一个tible:1 x 5
x1x2x3x4x5
1  57.3  29.3  25.3  51.0  37.8

有没有办法重写map函数以避免嵌套

不需要映射或列表,只需在基R中的整个对象上运行算术。等长加法只需在下面的
rep
中为每列重复向量1 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

我从你发布的内容中得到不同的值。不管怎样,只要
Map(simple_function,df1,vector1,df2)
有什么不对?如果您严格需要一个框架,那么
as.data.frame(Map(…)
,因为
Map
返回一个列表。很好,@nicola.你想要
pmap\u df(list(df1,list(vector1),df2),简单的函数)
?我想@aosmith的解决方案就是你想要做的。它之所以有效是因为
pmap()
需要一个列表列表,并且所有列表的长度必须相同或等于1(在这种情况下,它们是循环使用的)。如果在将所有3个对象放入列表之前不将向量放入
list()
,则它将不起作用,因为
df1
df2
的长度是列数(因为数据帧是向量列表),但向量的长度是其元素数。一旦你把你的向量放到一个列表中,这个列表的长度是1,它会被循环使用。换句话说,将
list(df1,vector1,df2)
传递到
pmap()
中是不起作用的,因为
vector1
与数据帧的长度不同,如果碰巧它的长度相同,在每次迭代中使用向量的每个元素时,您根本不会得到您期望的结果。通过将
vector1
本身传递到
list()
,它将成为一个1的列表,在每次迭代中循环使用。
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
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