Dplyr mutate: различие между вектором, который будет взят по элементам, и векторами, которые будут взяты как вектор - PullRequest
0 голосов
/ 29 июня 2018

Я использую dplyr для манипулирования данными. у меня есть два столбца: х и у. В третьем столбце (скажем, z) я хотел бы иметь первый индекс y во всех столбцах x.

Например:

enter image description here

Для первого ряда я получаю 4, потому что 7 находится на 4-й позиции в x.

Итак, я попытался

df <- df %>% 
  mutate(z = which (x==y)[1])

Но сравнение проводится поэлементно (т.е. я получаю только пять в z). Отсюда мой вопрос: как сделать различие между вектором, который нужно взять поэлементно, и векторами, которые будут взяты как вектор в dplyr mutate?

1 Ответ

0 голосов
/ 29 июня 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...