使用自定义函数从数据框引用矢量

时间:2018-01-19 23:57:08

标签: r

我试图调用一个矢量" a"来自数据框" df"使用功能。我知道我可以通过以下方式做到这一点:

> df$a
[1] 1 2 3

但是我想使用一个函数,其中数据框和向量名称都作为参数单独输入。这是我提出的最好的:

show_vector <- function(data.set, column) {
  data.set$column
}

但是,当我试一试时,这是怎么回事:

> show_vector(df, a)
NULL

如何更改此函数以成功引用向量df $ a,其中两者的名称作为参数输入到函数中?

4 个答案:

答案 0 :(得分:2)

实际上可以在不将列名称作为字符串传递的情况下执行此操作(换句话说,您可以传入未加引号的列名称:

show_vector <- function(data.set, column) {
  eval(substitute(column), envir = data.set)
}

用法示例:

df <- data.frame(a = 1:3, b = 4:6)

show_vector(df, b)
# 4 5 6

答案 1 :(得分:1)

我过去常常想过这种事情而且很难找到一个简单的方法。我提出的最好的是:

df <- data.frame(c(1, 2, 3), c(4, 5, 6))
colnames(df) <- c("A", "B")

test <- function(dataframe, columnName) {
  return(dataframe[, match(columnName, colnames(dataframe))])
}
test(df, "A")

答案 2 :(得分:1)

您可以使用substitute捕获输入向量名称,然后使用`as.character将其作为字符。

show_vector <- function(data.set, column) {
  data.set[,as.character(substitute(column))]
}

现在让我们来看看:

(dat=data.frame(a=1:3,b=4:6,c=10:12))
  a b  c
1 1 4 10
2 2 5 11
3 3 6 12

show_vector(dat,a)
[1] 1 2 3

show_vector(dat,"a")
[1] 1 2 3

有效。

我们也可以编写一个简单的输入字符串:

show_vector1 <- function(data.set, column) {
   data.set[,column]
 }

 show_vector1(dat,"a")
[1] 1 2 3

虽然如果列名不是字符,这将不起作用:

show_vector1(dat,a)

 **Show Traceback
 Rerun with Debug
 Error in `[.data.frame`(data.set, , column) : undefined columns selected** 

答案 3 :(得分:1)

如果您只将列名称放在引号中,即show_vector(df, "a")

,您的代码就可以使用

其他多种方法:

使用基本功能

func <- function(df, cname){
  return(df[, grep(cname, colnames(df))])
}

甚至

func <- function(df, cname){
  return(df[, cname])
}