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

Я хотел бы использовать функцию для установки первого столбца кадра данных в качестве имен строк.Я попытался включить 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 Ответ

0 голосов
/ 14 марта 2019

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

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 в качестве имен строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...