Передача имени столбца и фрейма данных в пользовательскую функцию в R - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь написать функцию в 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 ]

1 голос
/ 04 апреля 2019

Пожалуйста, взгляните на последний комментарий @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)
1 голос
/ 28 марта 2019

Две вещи:

  • в вашей функции 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...