Зачем цитировать в dplyr и почему не цитировать в dplyr?

Я преподаю вводный курс R, и студент задал мне вопрос, на который я не могу ответить. Вопрос в том, почему мы не ставим id и sex в кавычки после select в этом примере

df1 %>%
  select(id, sex)

Но мы поставили id в кавычках после inner_join в этом примере

df1 %>%
       inner_join(df2, by = 'id')

Лучшее, что я смог придумать, это то, что id стоит после знака =. Но я думаю, что есть лучший ответ.

Вы можете поместить столбцы в кавычки

Maël 22.02.2023 11:31
Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Laravel - это мощный PHP-фреймворк, используемый для создания масштабируемых и надежных веб-приложений. Одним из преимуществ Laravel является его...
Что такое двойные вопросительные знаки (??) в JavaScript?
Что такое двойные вопросительные знаки (??) в JavaScript?
Как безопасно обрабатывать неопределенные и нулевые значения в коде с помощью Nullish Coalescing
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание API-ресурса Laravel может быть непростой задачей. Она требует глубокого понимания возможностей Laravel и лучших практик, чтобы обеспечить...
Как сделать компонент справочного центра с помощью TailwindCSS
Как сделать компонент справочного центра с помощью TailwindCSS
Справочный центр - это веб-сайт, где клиенты могут найти ответы на свои вопросы и решения своих проблем. Созданный для решения многих распространенных...
Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
2
1
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ссылка для опрятной оценки: 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 как еще один вид аккуратной оценки.

moodymudskipper 22.02.2023 13:32
Ответ принят как подходящий

Чтобы ответить на более общий вопрос, когда мы используем имена столбцов в кавычках как строки “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)

Другие вопросы по теме