Ошибка векторизации R и dplyr mutate? - PullRequest
1 голос
/ 29 апреля 2020

У меня есть простая функция для вычисления векторизованной суммы (в этом примере я использую powersum , но в действительности я использую более сложную функцию) и data.frame для ее вычисления.

mapply прекрасно работает, но dplyr::mutate выдает предупреждение: Warning message: In 1:n : numerical expression has 4 elements: only the first used. Если я использую rowwise первый mutate дает мне правильный результат.

Буду признателен за понимание того, что происходит.

powersum <- function(n, p) {
  i <- 1:n # this is the basic structure that I am using
  sum(i^p) # `i^p` is more complex in my real function with more variables
}

df <- data.frame(
  n = c(1:4),
  p = rep(3, 4)
)

mapply(powersum, df$n, df$p) # works great

library(dplyr)
df %>% mutate(powersum = powersum(n, p)) # throws warning about elements

df %>% rowwise() %>% mutate(powersum = powersum(n, p)) # works, but why?

1 Ответ

0 голосов
/ 29 апреля 2020

Если нам нужна соответствующая опция в tidyverse

library(dplyr)
library(purrr)
df %>%
   mutate(powersum = map2_dbl(n, p, powersum))
#   n p powersum
#1 1 3        1
#2 2 3        9
#3 3 3       36
#4 4 3      100

rowwise работает как группировка по строке, таким образом, он принимает каждый элемент за раз и применяет функцию. Та же концепция, что и в l oop с mapply, где функция применяется к каждому из элементов. powersum не векторизовано, поскольку последовательность 1:n не векторизована. Например,

n1 <- 1:2
1:n1
[1] 1  

Предупреждение: В 1: n1: числовое выражение имеет 2 элемента: используется только первый

Случай mutate аналогичен применение функции с помощью

with(df, powerset(n, p))

или transform

transform(df, powersum = powerset(n, p))

Оба применяют функцию ко всей строке для каждого столбца

...