为什么当我通过 dplyr::mutate 使用函数时会收到长度警告,而该函数独立运行时效果很好?

Why do I get length warning when I use a function through dplyr::mutate, when the function works well standalone?

我一直在尝试向现有数据框添加一个新列,借助一个考虑了 'double' 向量类型以及所述数据框的一列的函数。可重现的代码是,

library('tidyverse')
set.seed(123)
b <- sort(sample(seq(20, 50, by=0.5), size=50))
f <- function(a) sum((b >= a)&(b<a+5), na.rm=TRUE)

x <- c(21, 23, 27, 31, 37, 39)
y <- c(23, 26, 29, 32, 39, 45)
XY <- data.frame(x, y)

XY %>% mutate(c= f(x))

在我的问题中,b 的长度是 4321XY$xXY$y 的长度是 180。当我 运行 函数 f 单独用于各种输入时,我得到的结果没有任何问题。一旦我将它与 mutate 一起使用,我不仅会收到长度警告,

Warning message:
“Problem with `mutate()` input `c`.
ℹ longer object length is not a multiple of shorter object length

但变异列 c 中的结果也不准确。我的猜测是 b 的长度导致了这个问题,但是函数 f 只需要计算 b 中属于给定条件的条目,所以为什么我得到关于长度的警告。我想了解这些警告是怎么回事以及如何解决它?

该函数未向量化,您需要应用它 rowwise :

library(dplyr)
XY %>% rowwise() %>% mutate(c = f(x))

我们可以使用map

library(dplyr)
library(purrr)
XY %>%
    mutate(c = map_dbl(x, f))

-输出

#   x  y  c
#1 21 23  8
#2 23 26  8
#3 27 29  7
#4 31 32 10
#5 37 39  9
#6 39 45  9

Vectorize函数并直接应用

XY %>% 
   mutate(c = Vectorize(f)(x))