用索引而不是名称指定列

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 值。您还应该将valuevariable 放在引号内。

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参数指定索引值)