我有几个数据帧和一个像这样的向量:
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个对象的列和行。但是似乎mapply
和pmap
都只将列作为输入,并且我必须做一个嵌套函数才能得到我想要的东西:
#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函数以避免嵌套?
答案 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