Отображение функции на столбцы и строки без использования вложенного применения - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть пара информационных фреймов и такой вектор:

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))

Я хотел бы взять функцию, которая перебирает столбцы и строки всех трех моих объектов. Но кажется, что и 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

Есть ли способы переписать функцию карты, чтобы избежать вложения?

1 Ответ

0 голосов
/ 02 ноября 2018

Нет необходимости в отображении или списках, просто запустите арифметику для целых объектов в базе 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
...