【问题标题】:Using ncol(.) argument in rename_with function gives error: Error in 2:ncol(.) : argument of length 0在 rename_with 函数中使用 ncol(.) 参数会产生错误:2:ncol(.) 中的错误:长度为 0 的参数
【发布时间】:2021-10-18 13:00:18
【问题描述】:

我正在尝试重命名数据框/tibble 中的所有列。

这个想法是给第一列一个特定/专用的名称,然后给所有其他列一个“连续”的名称,最后有一个下标。对于下标,我尝试使用 ncol(.) 函数,但不断收到标题中提到的错误。

我在这里错过了什么?

library(tidyverse)
df <- data.frame(col1 = c(1, 2, 3),
                 col2 = c(1, 2, 3),
                 col3 = c(1, 2, 3)) %>%
  as_tibble() %>%
  rename_with(.cols = everything(),
              .fn   = ~c("new_col_1", paste0("test_", 2:ncol(.))))

# Error in 2:ncol(.) : argument of length 0

仅供参考,将上面的 2:ncol(.) 部分更改为 2:3 即可,但我想动态传递。

【问题讨论】:

    标签: r tidyverse rename


    【解决方案1】:

    这与 tidyverse 非标准评估有关。如果您想更改每列的名称,您可以轻松地将 rename_with 与 base-R 的 setNames 函数交换(恰好也很适合管道):

    data.frame(col1 = c(1, 2, 3),
                     col2 = c(1, 2, 3),
                     col3 = c(1, 2, 3)) %>%
      setNames(c("new_col_1", paste0("test_", 2:ncol(.))))
    
    
    # A tibble: 3 x 3
    new_col_1 test_2 test_3
    <dbl>  <dbl>  <dbl>
      1         1      1      1
      2         2      2      2
      3         3      3      3
    

    【讨论】:

    • 效果很好。关于 rename_with 不能与 ncol 函数一起使用的原因,您是否有更多详细信息(或初学者的良好来源)?不是专家,我认为 tidyverse 很酷的一点是,您可以使用 whatever(.) 传递上一个管道的“结果”,所以奇怪的是这个特定的管道不起作用,而是一个基本的 R 函数是。
    • 在这种特殊情况下,至少存在两个问题。第一个是. 在公式中(以~ 字符开头)。管道只能将参数插入函数,但不能插入公式。二是在tidyverse中,这种公式被解释为匿名函数,.用来指代这个函数的参数。在您的情况下,. 以这种方式解释。这也是导致错误的原因。 (尝试执行2:ncol(c("a", "b"))。这里c("a", "b") 扮演匿名函数参数的角色——原始列名。)
    • 好的,我至少部分理解。您能看到我如何在 tidyverse 函数/公式中粘贴/使用 ncol 参数吗?
    • 问题不在于ncol,而在于.,因为它没有将data.frame作为一个整体,而是anonymus函数的参数。由于匿名函数获取原始名称作为输入,您只需将原始代码中的ncol 替换为length
    • 像这样:rename_with(.cols = everything(), .fn = ~c("new_col_1", paste0("test_", 2:length(.)))) 在其他情况下,tidyverse 还提供了可以提供帮助的“上下文依赖表达式”(但它们不适用于重命名):dplyr.tidyverse.org/reference/context.html
    【解决方案2】:

    在基础 R 中,您可以简单地使用:

    colnames(df) <- paste0('test_', 1:ncol(df))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      相关资源
      最近更新 更多