Объясните, как работает этот код?

Вопросы по статистическому пакету R. Не обязательно гео.
Ответить
Аватара пользователя
SS_Rebelious
Гуру
Сообщения: 1304
Зарегистрирован: 24 фев 2009, 16:51
Репутация: 99
Ваше звание: GIS pro-fan
Откуда: Lahti / Газ-ПУТИНбург
Контактная информация:

Объясните, как работает этот код?

Сообщение SS_Rebelious » 20 апр 2015, 12:53

Нашёл пример в котором показывается, как сделать так, чтобы подписи на графиках "ggplot2" не перекрывались. Всё отлично работает, и я смог его адаптировать для своих нужд, но я совершенно не понимаю, как это работает. Может ли кто-нибудь подробно разъяснить идею и описать, что происходит в конкретных моментах?

Тестовые данные:

Код: Выделить всё


vetotype.x <- structure(list(cowc = structure(c(5L, 7L, 24L, 24L, 23L, 36L,
34L, 38L, 23L, 6L, 8L, 38L, 38L, 23L, 5L, 7L, 24L, 24L, 23L,
36L, 34L, 38L, 23L, 6L, 8L, 38L, 38L, 23L), .Label = c("AFG",
"ANG", "AZE", "BNG", "BOS", "BUI", "CAM", "CDI", "CHA", "COL",
"CRO", "DOM", "DRC", "ETH", "GNB", "GRG", "GUA", "IND", "INS",
"IRQ", "KEN", "LAO", "LBR", "LEB", "MAL", "MLD", "MZM", "NEP",
"NIC", "PHI", "PNG", "RUS", "RWA", "SAF", "SAL", "SIE", "SOM",
"SUD", "TAJ", "UKG", "YAR", "ZIM"), class = "factor"), conflict = c("Bosnia 92-95",
"Cambodia 70-91", "Lebanon 58-58", "Lebanon 75-89", "Liberia 89-93",
"SieLeo 91-96", "Stafrica 83-91", "Sudan 63-72", "Liberia 94-96",
"Burundi 1993-2005", "Cote d'Ivoire 2002-2007", "Darfur, Sudan 2003-2010",
"Sudan 83-05", "Liberia 1999-2003", "Bosnia 92-95", "Cambodia 70-91",
"Lebanon 58-58", "Lebanon 75-89", "Liberia 89-93", "SieLeo 91-96",
"Stafrica 83-91", "Sudan 63-72", "Liberia 94-96", "Burundi 1993-2005",
"Cote d'Ivoire 2002-2007", "Darfur, Sudan 2003-2010", "Sudan 83-05",
"Liberia 1999-2003"), totalps = c(3L, 2L, 2L, 2L, 1L, 3L, 4L,
3L, 1L, 3L, 3L, 4L, 3L, 3L, 3L, 2L, 2L, 2L, 1L, 3L, 4L, 3L, 1L,
3L, 3L, 4L, 3L, 3L), vetotype = structure(c(1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("strictvetos", "lenientvetos"
), class = "factor"), intensity = c(3L, 4L, 2L, 5L, 2L, 2L, 2L,
2L, 2L, 3L, 2L, 2L, 2L, 2L, 3L, 4L, 2L, 6L, 2L, 2L, 4L, 2L, 2L,
3L, 3L, 2L, 2L, 2L)), .Names = c("cowc", "conflict", "totalps",
"vetotype", "intensity"), class = "data.frame", row.names = c(NA,
-28L))


Сам код. Строки, которые требуют пояснения, помечены знаками вопроса (# ???)

Код: Выделить всё


library(ggplot2)
# identify duplicated points
dupes <- aggregate(conflict~totalps+intensity+vetotype,vetotype.x,length) # ???
colnames(dupes)[4] = "dupe"
df <- merge(vetotype.x,dupes) # add dupe column # ???
df$vjust <- 0 # default vertical offset is 0
# calculate vertical offsets based on number of dupes
for (i in 2:max(df$dupe)) df[df$dupe==i,]$vjust<-seq(-trunc(i/2),-trunc(i/2)+i-1) # ???
# render the plot
vetotype.plot <- ggplot(df, aes(x=totalps, y=intensity, color=conflict))+
geom_point() +
labs(x="number of power-sharing arenas", y="intensity") +
ggtitle("Number of Power-Sharing areas and Veto intensity") +
geom_text(aes(label=conflict,vjust=vjust), hjust=0,size=4)+
scale_x_continuous(limits=c(1, 5))+
scale_y_continuous(limits=c(1, 6))+
theme(legend.position="none")+
facet_wrap(~vetotype, nrow=2)
plot(vetotype.plot)
Look for something long enough, and you will find it. Look for something without understanding, and it will find you...
"All paid jobs absorb and degrade the mind." Aristotle
If you take 1 step towards freedom it'll take 2 steps towards you!

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: Объясните, как работает этот код?

Сообщение gamm » 22 апр 2015, 08:45

все в хелпе прописано ...

dupes <- aggregate(conflict~totalps+intensity+vetotype,vetotype.x,length) # ???
считает сколько раз встречается conflict для каждого сочетания totalps+intensity+vetotype
потом это число обзывают dupe (хорошо хоть не dupa ...)

df <- merge(vetotype.x,dupes) # add dupe column # ???
соединяет две таблицы по общему множеству столбцов (это как раз totalps+intensity+vetotype)
т.е. добавляет число повторов в исходную таблицу

а потом это число повторов используется в цикле для сдвига надписей

Аватара пользователя
SS_Rebelious
Гуру
Сообщения: 1304
Зарегистрирован: 24 фев 2009, 16:51
Репутация: 99
Ваше звание: GIS pro-fan
Откуда: Lahti / Газ-ПУТИНбург
Контактная информация:

Re: Объясните, как работает этот код?

Сообщение SS_Rebelious » 22 апр 2015, 12:25

Спасибо за объяснение! Но нельзя ли расписать немного подробнее:
Почему в aggregate() используется lenght?
Почему merge расставляет значения как надо, хотя датафреймы имеют разное количество строк?
Look for something long enough, and you will find it. Look for something without understanding, and it will find you...
"All paid jobs absorb and degrade the mind." Aristotle
If you take 1 step towards freedom it'll take 2 steps towards you!

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: Объясните, как работает этот код?

Сообщение gamm » 22 апр 2015, 13:52

SS_Rebelious писал(а):Почему в aggregate() используется lenght?
так это и есть требуемое число повторов - длина группы, aggregate - это вылитый SELECT ... GROUP BY, а length - COUNT(*) - если вдруг SQL знаком
Почему merge расставляет значения как надо, хотя датафреймы имеют разное количество строк?
так цикл жеж, до максимального числа дублей
for (i in 2:max(df$dupe))

а втот эта штука выделяет нужные дубли, и правит им vjust (чисто select + update)
df[df$dupe==i,]$vjust<-seq(-trunc(i/2),-trunc(i/2)+i-1) # ???

Ответить

Вернуться в «R»

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и 5 гостей