R中的列顺序

时间:2016-07-13 16:09:10

标签: r

我想按数据框中列的顺序获取数字。

df <- data.frame(item = rep(c('a','b','c'), 3),
             year = rep(c('2010','2011','2012'), each=3),
             count = c(1,4,6,3,8,3,5,7,9))

让我们说我正在寻找的功能是columnorder。我希望得到这个结果

x <- columnorder(df$count)
x
> 3

x <- columnorder(df$item)
x
> 1

这似乎是一项基本任务,但直到现在我还无法找到答案。我将感谢你的帮助。谢谢

2 个答案:

答案 0 :(得分:1)

正如@mtoto的评论中所提出的,这是一个解决方案:

x <- which(colnames(df) == "count")

答案 1 :(得分:1)

你说,

  

这似乎是一项基本任务,但直到现在我还无法找到答案。

在一般意义上,您要尝试做什么 - 将列名转换为列索引 - 基本的,这是一个非常常见的问题。但是,您在上面描述的特定情况(输入的格式为object_name$column_name)是非典型的WRT,您要尝试实现的目标,这很可能是您找不到现有解决方案的原因。

简而言之,问题在于当您将参数作为df$count传递时,您可能只是使用了c(1,4,6,3,8,3,5,7,9),因为df$count将被评估为c(1,4,6,3,8,3,5,7,9) }。当然,R确实允许相当多的元编程,所以通过一些额外的工作,这个可以实现,例如

column_order <- function(expr) {
    x <- strsplit(deparse(substitute(expr)), "$", TRUE)[[1]]
    match(x[2], names(get(x[1])))
}

column_order(df$item)
#[1] 1
column_order(df$year)
#[1] 2
column_order(df$count)
#[1] 3

但正如我上面所说,这是你最终想要做的事情的非典型界面。一个更标准的方法是这个函数接受列名(通常作为字符串)和目标对象作为参数,在这种情况下解决方案更简单:

column_order2 <- function(col, obj) match(col, names(obj))

column_order2("item", df)
#[1] 1
column_order2("year", df)
#[1] 2
column_order2("count", df)
#[1] 3