При правильной комбинации $ lookup, $ project и $ match вы можете присоединиться к нескольким таблицам по нескольким параметрам. Это связано с тем, что они могут быть связаны несколько раз.
Предположим, что мы хотим сделать следующее ( reference )
SELECT S.* FROM LeftTable S
LEFT JOIN RightTable R ON S.ID =R.ID AND S.MID =R.MID WHERE R.TIM >0 AND
S.MOB IS NOT NULL
Шаг 1: Свяжите все таблицы
, вы можете $ lookup сколько угодно таблиц.
$ lookup - по одному для каждой таблицы в запросе
$ unwind - поскольку данные денормализированы правильно, иначе они завернуты в массивы
Python code ..
db.LeftTable.aggregate([
# connect all tables
{"$lookup": {
"from": "RightTable",
"localField": "ID",
"foreignField": "ID",
"as": "R"
}},
{"$unwind": "R"}
])
Шаг 2: Определите все условные выражения
$ project: определите здесь все условные операторы и все переменные, которые вы хотите выбрать.
Python Code ..
db.LeftTable.aggregate([
# connect all tables
{"$lookup": {
"from": "RightTable",
"localField": "ID",
"foreignField": "ID",
"as": "R"
}},
{"$unwind": "R"},
# define conditionals + variables
{"$project": {
"midEq": {"$eq": ["$MID", "$R.MID"]},
"ID": 1, "MOB": 1, "MID": 1
}}
])
Шаг 3: Присоедините все условные обозначения
$ match - присоедините все условия, используя OR или AND и т. д. Их могут быть кратные ,
$ project: undefine all conditionals
Python Code ..
db.LeftTable.aggregate([
# connect all tables
{"$lookup": {
"from": "RightTable",
"localField": "ID",
"foreignField": "ID",
"as": "R"
}},
{"$unwind": "$R"},
# define conditionals + variables
{"$project": {
"midEq": {"$eq": ["$MID", "$R.MID"]},
"ID": 1, "MOB": 1, "MID": 1
}},
# join all conditionals
{"$match": {
"$and": [
{"R.TIM": {"$gt": 0}},
{"MOB": {"$exists": True}},
{"midEq": {"$eq": True}}
]}},
# undefine conditionals
{"$project": {
"midEq": 0
}}
])
Практически любая комбинация таблиц, условных обозначений и объединений может быть выполнена таким образом ,
Во-первых, я бы настоятельно рекомендовал поискать чит-листы для R, которые очень удобно размещены здесь
Я лично больше привык писать полную версию функции ggplot, потому что она более ясно, когда вы лучше познакомитесь с этой библиотекой.
Задача
Сначала вам нужно понять идею, лежащую в основе гистограмм, гистограммы работают, когда у вас нет значения и вы хотите рассчитать количество или плотность некоторых характеристик. В вашем случае вам просто нужны простые точки для представления значений, которые у вас уже есть в вашем фрейме данных. Это легко сделать с некоторым пониманием ggplot.
Эстетика
При использовании функции ggplot () требуются некоторые основные аргументы.
ggplot(data = NULL, mapping = aes(), ..., environment = parent.frame())
Данные, которые вы предоставляете, представляют собой целые кадры beta_0jk. Сопоставление соответствует элементам, которые вы определяете своими столбцами, поэтому вам необходимо указать их:
x - что-то для группировки по вашим значениям, я бы сказал, что вы захотите «Car» здесь, чтобы указать модель
blockquote>
y - это должно быть ясно - «Value» - это переменная, которую вы измеряете, поэтому вы выбрали ее для представления значения оси y
[1119 ] col - это снова GROUP, но она работает не так, как x - она делает разные цвета для каждой указанной вами группы. Чтобы использовать его, вы должны убедиться, что ваш столбец является факторомРеализация
ggplot2::ggplot(beta_0jk,ggplot2::aes( x = Car, y = Value, col = Country) ) + geom_jitter()
Начните с этого и используйте шпаргалку ggplot2, чтобы сделать вашу работу результат, потому что, если честно, я не знаю, что вы хотите показать с энтузиазмом. Я также рекомендую поискать библиотеки dplyr и tidyr
Это то, что вы ищете? Чтобы все бары были одинаковой ширины, мне пришлось заполнить data
дополнительной строкой, поскольку в Car == 'BMW X5'
нет Country == 'US'
. Канал подготовки данных %>%
был полностью вдохновлен в на этот ответ .
library(tidyverse)
library(ggplot2)
data %>%
spread(key = Car, value = Value, fill = NA) %>%
gather(key = Car, value = Value, -Country) %>%
ggplot(aes(x = Car, y = Value, fill = Country)) +
geom_col(position = position_dodge())
Данные.
data <- read.table(text = "
Car Country Value
'Audi A6' US 23
'Audi A6' UK 12
'Audi A6' DE 19
'BMW X5' UK 8
'BMW X5' DE 5
", header = TRUE)