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