Я преподаю вводный курс R, и студент задал мне вопрос, на который я не могу ответить. Вопрос в том, почему мы не ставим id и sex в кавычки после select в этом примере
df1 %>%
select(id, sex)
Но мы поставили id в кавычках после inner_join в этом примере
df1 %>%
inner_join(df2, by = 'id')
Лучшее, что я смог придумать, это то, что id стоит после знака =. Но я думаю, что есть лучший ответ.
Ссылка для опрятной оценки: https://dplyr.tidyverse.org/articles/programming.html
Спецификация для inner_join: https://dplyr.tidyverse.org/reference/mutate-joins.html
По сути, аргумент inner_join by = принимает «спецификацию соединения, созданную с помощью join_by(), или вектор символов переменных для соединения».
# character vector is your provided example
df1 %>%
inner_join(df2, by = 'id')
# works
# join_by() form uses tidy evaluation
df1 %>%
inner_join(df2, by = join_by(id))
# also works
В конечном счете, это выбор дизайна, поэтому ответ на вопрос «почему» на самом деле «потому что дизайнер сделал это именно так». Может быть, немного более полезно, причина историческая: функции соединения предшествуют аккуратной «революции» выбора, и недавний аргумент join_by() был создан, чтобы компенсировать это. Тем не менее, join_by() имеет свой собственный DSL и не использует аккуратный выбор или маскирование данных (два задокументированных типа аккуратной оценки), поэтому я считаю, что первая ссылка вводит в заблуждение, хотя я не возражал бы против ее обновления, чтобы включить этот новый DSL как еще один вид аккуратной оценки.
Чтобы ответить на более общий вопрос, когда мы используем имена столбцов в кавычках как строки “column_name” и когда мы используем имена голых объектов column_name:
В общем, tidyverse использует нестандартную оценку, и благодаря этому мы можем использовать голые имена объектов в качестве имен столбцов column_name в большинстве функций большую часть времени.
Существуют функции, такие как select и rename, которые принимают обе функции:
library(tidyverse)
mtcars %>%
select("hp") %>%
head()
#> hp
#> Mazda RX4 110
#> Mazda RX4 Wag 110
#> Datsun 710 93
#> Hornet 4 Drive 110
#> Hornet Sportabout 175
#> Valiant 105
mtcars %>%
select(hp) %>%
head()
#> hp
#> Mazda RX4 110
#> Mazda RX4 Wag 110
#> Datsun 710 93
#> Hornet 4 Drive 110
#> Hornet Sportabout 175
#> Valiant 105
А еще есть функции, которые принимают только строки. До версии 1.0.10 мы могли использовать только строковые имена столбцов в функциях соединения. Я бы расценил это как несоответствие большинству других функций tidyverse. Теперь у нас есть join_by(), который позволяет нам использовать голые имена объектов, как показано в ответе выше.
Я лично стараюсь избегать имен строковых переменных ”column_name”, где это возможно, чтобы быть последовательным. Строковые имена столбцов необходимы, когда мы создаем новые столбцы, которых еще не существует, например, когда мы используем separate() для создания столбцов A и B:
df <- tibble(x = c("x.y", "x.z", "y.z"))
df %>% separate(x, c("A", "B"))
#> # A tibble: 3 x 2
#> A B
#> <chr> <chr>
#> 1 x y
#> 2 x z
#> 3 y z
Created on 2023-02-22 by the reprex package (v2.0.1)
Вы можете поместить столбцы в кавычки