为什么当我通过 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
的长度是 4321
,XY$x
和 XY$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))
我一直在尝试向现有数据框添加一个新列,借助一个考虑了 '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
的长度是 4321
,XY$x
和 XY$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))