дискретное значение ошибки ggplot r поставленное к непрерывному масштабу

Список прилагается.

    Site Name  5833             count  ratio
1   Boston     0 days per week  1      0.01428571
2   Boston     1 day per week   6      0.08571429
3   Boston     2 days per week  11     0.15714286
4   Boston     3 days per week  5      0.07142857
5   Seattle    0 days per week  2      0.02857143
6  Seattle     1 day per week   6      0.08571429
7  Seattle     2 days per week  10     0.14285714
8  Seattle     3 days per week  8      0.11428571

когда я использую ggplot — я должен использовать имя

name <- "5833"
ggplot(com_agg,aes(x=com_agg[,c(name)], y=ratio,fill=`Site Name`))+
geom_bar(stat = "identity", position = "dodge")

Я получаю ошибку:

"Don't know how to automatically pick scale for object of type tbl_df/tbl/data.frame. 
Defaulting to continuous. Error: Discrete value supplied to continuous scale"

Я заметил, что выбор имени столбца для этого фрейма данных должен быть включен в пару обратных знаков автоматически в R. Это может быть связано с пробелом или специальным именем в Столбцах. поэтому я не могу просто использовать имя столбца в ggplot.

2 ответа

  1. Даже без формальной проверки classпеременной, из вложенных данных очевидно, что вы передаете строку или фактор, не глядя на класс. Вы можете легко преобразовать переменную в числовую, запустив:

    com_agg$`5833` <- as.numeric(substr(com_agg$`5833`, 1, 1))
    

    В случае, если ваша переменная более сложна, чем в приведенном примере, вы можете рассмотреть возможность просмотра taRfix::destingили аналогичных функций, которые позволили бы вам удобно справиться с этой незначительной проблемой.

    Мое предпочтение для решения этой проблемы будет включать использование dplyr/ ggplotpipeline, где вы можете легко применить свои преобразования без необходимости создавать другой объект или изменять satate существующего объекта. Например:

    com_agg %>%
        mutate(`5833` = as.numeric(substr(`5833`, 1, 1))) %>%
        ggplot(aes(x = `5833`, y=ratio, fill =`Site Name`)) +
            geom_bar(stat = "identity", position = "dodge")
    

    Похоже, что фрейм данных, который вы используете, был созданcheck.names = FALSE, как в:

    data.frame("1" = 1, check.names = FALSE)
    

    прежде чем что-либо делать, я бы предложил вам рассмотреть возможность использования синтаксически правильных имен, следовательно``, в приведенном выше синтаксисе. Вы можете создать синтаксически правильные имена, запустив:

    make.names(names(dta))
    

    на ваших данных. При желании можно ввести следующий синтаксис в ggplot/ dplyrpipeline:

    setNames(make.names(names(.)), object = .)
    

    Это исправит синтаксически неверные имена. Например 5833бы стал X5833. Я думаю, что это может сделать ваши циклы немного более утомительными для записи, но, в принципе, стоит сделать так, как это избавит вас от использования ``и потенциальных будущих неудач с попыткой использовать константу в качестве имени столбца.

  2. Спасибо за все ответы.

    Я изменил имена переменных в соответствии со стандартом, чтобы избежать суеты выбора. во-вторых, я использовал aes_string для ggplot внутри цикла for, и это оказывается эффективным способом использования ggplot внутри цикла for. теперь это работает!