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