Функциональное программирование с помощью dplyr: column_to_rownames() внутри функции

#r #function #dplyr

#r #функция #dplyr

Вопрос:

Я хотел бы использовать функцию для задания первого столбца фрейма данных в качестве имен строк. Я попытался включить column_to_rownames() внутри функции. Вот моя первая попытка (после ознакомления с этой статьей).

 df <- tibble(a = c("a","a","a","b","b"), b= sample(1:10, 5))

col_to_row <- function(df, grp_var){
  require(dplyr)
  grp_var <- enquo(grp_var)

  df %>% column_to_rownames(var = quo_expr(grp_var))
}
col_to_row(df, a)
  

Что приводит к ошибке:

  Error in match(x, table, nomatch = 0L) : 'match' requires vector arguments 
  

Я попытался заменить quo_expr(grp_var) на !!grp_var:

 col_to_row <- function(df, grp_var){
  require(dplyr)
  grp_var <- enquo(grp_var)

  df %>% column_to_rownames(var = !!grp_var)
}
  

Что приводит к ошибке:

  Error in is_quosure(e2) : argument "e2" is missing, with no default
  

Я попробовал решение с базовым R:

     col_to_row_base <- function(df, grp_var){
      df2 <- df[,-1]
      print(df2) # for debugging
      print(df[,1]) # for debugging
      row.names(df2) <- df[,1]
    }
  

Что выдает ошибку:

  Error in `.rowNamesDF<-`(x, value = value) : invalid 'row.names' length 
  

Есть мысли о том, как я могу использовать функцию для задания первого столбца фрейма данных в качестве имен строк?

Это мой первый пост здесь, поэтому, пожалуйста, дайте мне знать, если это не соответствует стандартам.

Работает под управлением R версии 3.5.2, платформа: x86_64-pc-linux-gnu (64-разрядная), Linux Mint 19, dplyr_0.8.0.1

Комментарии:

1. Базовый вариант не работает, потому что, если у вас есть данные из двух столбцов.frame df2 <- df[,-1] создает df2 вектор, если вы измените его на df2 <- df[,-1, drop = FALSE] , он должен работать.

Ответ №1:

Имена строк на самом деле не очень хорошая практика, но если вы должны это сделать:

 col_to_row_base <- function(df, names_col) {
    col_idx <- which(names(df) == names_col)
    df2 <- df[, -col_idx, drop = FALSE]
    row.names(df2) <- df[, col_idx]
    df2
}
  

Кроме того, имена строк нельзя дублировать, так что это может быть одной из причин появления ошибок, если вы пытались присвоить значения в столбце a в качестве имен строк.