将列名称和数据框传递给R中的自定义函数

时间:2019-03-28 19:11:55

标签: r dataframe apply sapply mapply

我正在尝试在R中编写一个函数:

1)接收数据帧和列名作为参数。 2)在数据框中的列上执行操作。

func <- function(col, df)
{
  col = deparse(substitute(col))
  print(paste("Levels: ", levels(df[[col]])))
}


func(Col1, DF)

func(Col2, DF)

mapply(func, colnames(DF)[1:2], DF)

输出

> func(Col1, DF)
[1] "Levels:  GREEN"  "Levels:  YELLOW"

> func(Col2, DF)
[1] "Levels:  0.1" "Levels:  1"  

> mapply(func, colnames(DF)[1:2], DF)
 Error in `[[.default`(df, col) : subscript out of bounds 

2 个答案:

答案 0 :(得分:1)

两件事:

  • 在函数func中,您将deparse(substitute(col))应用于您期望不是字符串的对象col。因此,它可以与func(Col1, DF)一起使用。但是在您的mapply()调用中,参数colnames(...)是一个字符串,因此会产生错误。与func('Col1', DF)获得的错误相同。

  • mapply()调用中,所有参数都必须是向量或列表。因此,您需要使用list(df, df),或者如果您不想复制,请删除函数df的参数func

这是一种可行的替代方法:

func <- function(col, df)
{
  print(paste("Levels: ", levels(df[,col])))
}

mapply(FUN = func, colnames(DF)[1:2], list(DF, DF))

答案 1 :(得分:1)

请查看@demarsylvain的最新评论-也许是您身边的复制粘贴错误,您应该这样做:

func <- function(col,df) {
  print(paste("Levels: ", levels(df[,col])))
}

mapply(FUN = func, c('Species', 'Species'), list(iris, iris))

您做到了:

func <- function(col) {
  print(paste("Levels: ", levels(df[,col])))
}

mapply(FUN = func, c('Species', 'Species'), list(iris, iris))

请支持并接受@demarsylvain的解决方案,它有效

编辑以发表您的评论:

要为列名的任意列表提供通用版本,可以使用此代码,对于循环很抱歉:)

func <- function(col,df) {
  print(paste("Levels: ", levels(df[,col])))
}

cnames = colnames(iris)


i <- 1
l = list()
while(i <= length(cnames)) {
  l[[i]] <- iris
  i <- i + 1
}

mapply(FUN = func, cnames, l)