用索引而不是名称指定列
Posted
技术标签:
【中文标题】用索引而不是名称指定列【英文标题】:Specifying column with its index rather than name 【发布时间】:2013-04-17 17:09:32 【问题描述】:我编写了一个函数来使用ggplot
函数获取比例堆积条形图。现在我在这个ID
中使用列名。
PropBarPlot<-function(df, mytitle="")
melteddf<-melt(df, id="ID", na.rm=T)
ggplot(melteddf, aes(ID, value, fill=variable)) +
geom_bar(position="fill") +
theme(axis.text.x = element_text(angle=90, vjust=1)) +
labs(title=mytitle)
我想让它通用。所以我想使用列索引而不是列名。我试着做这样的事情。
PropBarPlot<-function(df, mytitle="")
melteddf<-melt(df, id=names(df)[1], na.rm=T)
ggplot(melteddf, aes(names(df)[1], value, fill=variable)) +
geom_bar(position="fill") +
theme(axis.text.x = element_text(angle=90, vjust=1)) +
labs(title=mytitle)
但是没有用。有人可以建议我怎么做吗??
谢谢。
【问题讨论】:
可能是重复的,但请尝试aes_string(names(df)[1])
@baptiste 错误:无法将类“uneval”强制转换为 data.frame
如果没有包含数据的可重现示例,很难判断
【参考方案1】:
正如@baptiste 所指出的,您应该使用aes_string()
而不是aes()
来使用字符串来定义x 和y 值。您还应该将value
和variable
放在引号内。
PropBarPlot<-function(df, mytitle="")
melteddf<-melt(df, id=names(df)[1], na.rm=T)
ggplot(melteddf, aes_string(x=names(df)[1],y= "value", fill="variable")) +
geom_bar(position="fill") +
theme(axis.text.x = element_text(angle=90, vjust=1)) +
labs(title=mytitle)
【讨论】:
aes_string() 方法现在已软弃用。我在这里发布了另一个解决方案:***.com/a/69286410/9059865,我认为这与当前的准引用实践一致。【参考方案2】:正如@Bryan Shalloway 所指出的,aes_string()
方法现在已被软性弃用,取而代之的是整洁的评估。使用整洁的评估方法,我的解决方案是:
library(reshape)
library(ggplot2)
# let's start by creating an example dataframe
id <- c(1, 2, 3, 4)
var1 <- c(10, 20, 10, 20)
var2 <- c(6, 3, 2, 5)
df <- data.frame(id, var1, var2)
# Now let's build the function
PropBarPlot<-function(df, mytitle="")
# here I create a variable that contains the first element of the vector
# of df column names (it's a string)
my_name <- colnames(df)[1]
# here we melt, using the new variable as the id parameter
melteddf<-melt(df, id=my_name, na.rm=T)
# and here we plot, using the .data pronoun and the new variable
ggplot(melteddf, aes(x = .data[[my_name]],y = value, fill = variable)) +
geom_bar(position="fill", stat="identity") +
theme(axis.text.x = element_text(angle=90, vjust=1)) +
labs(title=mytitle)
如果您想了解更多关于 tidy 评估的信息(附有分步说明和实际示例),我竭诚推荐 Ian Lyttle 的学习者教程,地址为https://ijlyttle.shinyapps.io/tidyeval/
【讨论】:
以上是关于用索引而不是名称指定列的主要内容,如果未能解决你的问题,请参考以下文章
pandas读取csv数据index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引使用reset_index函数把行索引重置为列数据(原来的行索名称转化为列索引的最外层)
pandas读取csv数据index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引使用reset_index函数把行索引重置为列数据(原来的行索名称转化为列索引的最外层)
pandas读取csv数据index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引使用reorder_levels函数改变调整行层索引各层的顺序(指定新的索引层名称列表)
pandas读取csv数据index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引使用reorder_levels函数改变调整行层索引各层的顺序(指定新的索引层名称列表)
pandas读取csv数据参数指定作为行索引的数据列索引列表形成复合(多层)行索引使用xs函数获取列切面数据(axis参数指定对列进行切面level参数指定列层索引名称key参数指定索引值)
pandas读取csv数据参数指定作为行索引的数据列索引列表形成复合(多层)行索引使用xs函数获取列切面数据(axis参数指定对列进行切面level参数指定列层索引名称key参数指定索引值)