Как указывали другие, вы не можете этого сделать. PHP имеет функцию constant()
, которая не может быть вызвана непосредственно в строке, но мы можем легко обойти это.
$constant = function($cons){
return constant($cons);
};
и базовый пример ее использования:
define('FOO', 'Hello World!');
echo "The string says {$constant('FOO')}";
Так что твой код на самом деле работает нормально для меня. Похоже, что это может быть проблемой с версиями пакетов, потому что кажется странным, что вы используете функцию plyr summarise
.
Однако, вот немного более краткий способ создания этого графа (и, надеюсь, это полезно для всего, что вы хотите добавить к этому графику)
brfss_2013 %>%
# Add count of income levels first (note this only adds a variable)
add_count(incomeLev) %>%
rename(count_inc = n) %>%
# Count observations per group (this transforms data)
count(incomeLev, mentalHealth, count_inc) %>%
rename(count_mentalHealth = n) %>%
mutate(percent= count_mentalHealth / count_inc) %>%
ggplot(aes(x= incomeLev,
y= count_mentalHealth,
# Technically you don't need this group here but groups can be handy
group= mentalHealth)) +
geom_bar(aes(fill=mentalHealth),
stat="identity")+
# Using the scales package does the percent formatting for you
geom_text(aes(label = scales::percent(percent)), vjust = 1)+
theme_minimal()
Прежде всего, ваш код работает невероятно хорошо, когда вы превращаете все в символ. Таким образом, вы можете просто сделать
brfss_2013[c("incomeLev", "mentalHealth")] <-
lapply(brfss_2013[c("incomeLev", "mentalHealth")], as.character)
и затем просто запустить свой код, как вы поняли.
Но, давайте сделаем это с факторами (в этом случае не запускайте строку lapply(.)
!).
Требуется категория "missing"
, которую можно получить, добавив новый уровень "missing"
для NA
с.
levels(brfss_2013$incomeLev) <- c(levels(brfss_2013$incomeLev), "missing")
brfss_2013$incomeLev[is.na(brfss_2013$incomeLev)] <- "missing"
Затем, ваша агрегация (в базовой R-форме).
b1 <- with(brfss_2013, aggregate(list(count_mentalHealth=incomeLev),
by=list(mentalHealth=mentalHealth, incomeLev=incomeLev),
length))
b2 <- aggregate(mentalHealth ~ ., brfss_2013, length)
names(b2)[2] <- "count_inc"
brfss_2013.agg <- merge(b1, b2)
rm(b1, b2) # just to clean up
Добавить столбец "percent"
.
brfss_2013.agg$percent <- with(brfss_2013.agg, count_mentalHealth / count_inc)
Участок.
library(ggplot2)
ggplot(brfss_2013.agg, aes(x=incomeLev, y=count_mentalHealth, group=mentalHealth)) +
geom_bar(aes(fill=mentalHealth), stat="identity") +
geom_text(aes(label=sprintf("%0.1f%%", percent)),
position=position_stack(vjust=0.5))
Результат