【问题标题】:Functional programming with dplyr: column_to_rownames() inside function使用 dplyr 进行函数式编程:函数内部的 column_to_rownames()
【发布时间】:2019-03-13 23:11:23
【问题描述】:

我想使用一个函数将数据框的第一列设置为行名。我试图在函数中包含 column_to_rownames() 。这是我最初的尝试(在咨询this article 之后)。

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

【问题讨论】:

  • 基本情况不起作用,因为如果您有两列 data.frame df2 &lt;- df[,-1] 使 df2 成为向量,如果您将其更改为 df2 &lt;- df[,-1, drop = FALSE] 它应该可以工作。

标签: r function dplyr


【解决方案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 列中的值分配为行名,这可能是您遇到错误的原因之一。

【讨论】:

    猜你喜欢
    • 2018-05-04
    • 2018-12-15
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    相关资源
    最近更新 更多