library(tidyverse)
df <- data.frame(ID=(c("1", "2", "3", "4", "5", "10a", "10b", "11")),
y=c(seq(100,500,100), 150, 155, 180), stringsAsFactors = FALSE)
简单数据的简单修复
df$numId<-1:nrow(df)
ggplot(df, aes(x=reorder(ID,numId), y = y)) +
geom_col() +
labs(x='ID', y='Value')
结果
创建一个生成数值的函数
create_id<-function(x) {
if(!grepl('[a-z]',x,ignore.case = TRUE)) {
return(as.numeric(x))
} else {
letter<-tolower(gsub('[0-9]+',"",x))
letter_value<-which(letters==letter)/100
number<-as.numeric(gsub('[a-z]',"",x)) + letter_value
return(number)
}
}
df<-df %>%
group_by(ID, y) %>%
mutate(nid = round(create_id(ID),3))
ggplot(df, aes(x=reorder(ID,nid), y = y)) +
geom_col() +
labs(x='ID', y='Value')
结果
感谢@user12728748 的回答以及提供数据帧代码。我的回答只是为了满足问题中的 ggplot2 标签。上面的答案同样合适。