我想按数据框中列的顺序获取数字。
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
这似乎是一项基本任务,但直到现在我还无法找到答案。我将感谢你的帮助。谢谢
答案 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