dplyr
не определяет, применяется ли функция поэлементно. mutate
предоставляет только синтаксис, который позволяет вам использовать другие функции более кратко, признавая, что если вы ссылаетесь на x
внутри mutate
, вы, вероятно, имеете в виду столбец df$x
в df
. Он также выполняет один простой шаг широковещания, где, если вы предоставите ему функцию, которая возвращает только одно значение, он скопирует ее во весь вывод.
Мы можем показать то же поведение с which
и match
вне dplyr ниже. Поскольку ==
выполняет поэлементное сравнение, ваш первый метод возвращает все 5
. match
с другой стороны, «возвращает вектор позиций (первых) совпадений своего первого аргумента во втором» (из документации), что вам и нужно. Я сравниваю два синтаксиса внизу, чтобы показать, что ключ - это та функция, которую вы предоставляете, которая определяет способ чтения входных данных, а не mutate
.
x = c(1,2,3,7,9)
y = c(7,3,9,1,9)
x == y
#> [1] FALSE FALSE FALSE FALSE TRUE
which(x == y)
#> [1] 5
match(y, x)
#> [1] 4 3 5 1 5
library(dplyr)
df <- data.frame(x, y)
df$z1 = match(df$y, df$x) # a base R syntax that forces you to specify the data frame name
df <- df %>% mutate(z2 = match(y, x)) # dplyr syntax that is more concise
df # they produce the same result
#> x y z1 z2
#> 1 1 7 4 4
#> 2 2 3 3 3
#> 3 3 9 5 5
#> 4 7 1 1 1
#> 5 9 9 5 5
Создано в 2018-06-29 пакетом Представление (v0.2.0).