我附上了一份清单。
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时 - 我必须使用名称< - “5833”,因为这将在稍后进入for循环。
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中的列名。
答案 0 :(得分:0)
即使没有正式验证变量的class
,从附加的数据中很明显你是在传递字符串或因子而不看类。您可以通过运行以下命令轻松将变量转换为数字:
com_agg$`5833` <- as.numeric(substr(com_agg$`5833`, 1, 1))
如果您的变量比提供的示例更复杂,您可以考虑查看taRfix::desting
或类似的功能,以便您方便地处理这个小挑战。
我对解决此问题的偏好将涉及使用dplyr
/ ggplot
管道,您可以轻松应用转换,而无需创建其他对象或修改现有对象的饱和度。例如:
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
/ dplyr
管道中引入以下语法:
setNames(make.names(names(.)), object = .)
这将修复语法错误的名称。例如,5833
将成为X5833
。我认为这可能会使你的循环写得稍微繁琐,但原则上它值得做,因为它会让你使用 ``
以及尝试使用常量作为列名的潜在未来意外
答案 1 :(得分:0)
感谢所有回复。
我更改了变量名称以符合标准,以避免选择的喧嚣。其次,我在for循环中使用了ag_string for ggplot,这是在for循环中使用ggplot的有效方法。现在它正在运作!