r - 为什么 mutate() 和 add_column() 不接受相同的基本参数?

标签 r dplyr tibble

我经常希望在特定索引处添加新列; mutate() 没有一个简单的实现,而 add_column() 通过 .before 和 .after 参数实现。我希望这两个函数在简单设置中表现相同,但事实并非如此。下面是将行索引转换为新变量的 MWE。 R 文档没有说清楚:为什么这两个函数的基本语法不同?

dat <- as.tibble(matrix(rnorm(1e4), nrow=100))
dat1 <- dat %>% mutate(id=row_number()) # works as expected
dat2 <- dat %>% add_column(id=row_number()) # throws error
dat3 <- dat %>% add_column(id=1:nrow(dat), .before=1) # works, but harder to read

最佳答案

如果你检查这两个函数的代码,你会得到一些线索。

dplyr::变异

function (.data, ...) 
{
    UseMethod("mutate")
}
<environment: namespace:dplyr>

tibble::add_column

function (.data, ..., .before = NULL, .after = NULL) 
{
    df <- tibble(...)
    if (ncol(df) == 0L) {
        return(.data)
    }
    if (nrow(df) != nrow(.data)) {
        if (nrow(df) == 1) {
            df <- df[rep(1L, nrow(.data)), ]
        }
        else {
            stopc("`.data` must have ", nrow(.data), pluralise_n(" row(s)", 
                nrow(.data)), ", not ", nrow(df))
        }
    }
    extra_vars <- intersect(names(df), names(.data))
    if (length(extra_vars) > 0) {
        stopc(pluralise_msg("Column(s) ", extra_vars), pluralise(" already exist[s]", 
            extra_vars))
    }
    pos <- pos_from_before_after_names(.before, .after, colnames(.data))
    end_pos <- ncol(.data) + seq_len(ncol(df))
    indexes_before <- rlang::seq2(1L, pos)
    indexes_after <- rlang::seq2(pos + 1L, ncol(.data))
    indexes <- c(indexes_before, end_pos, indexes_after)
    .data[end_pos] <- df
    .data[indexes]
}
<environment: namespace:tibble>

首先,您会注意到它们来自两个不同的包,尽管它们都是 的一部分。 .

其次,您会看到 mutate 使用指定的方法,而 add_column 更像是一个以 编写的便捷函数。与一些魔法。

我不确定这两个包的路线图,但是,如果还没有提出或 fork 项目并提供拉取请求,我确信您可以提出增强功能。这将是一个有用的补充。

更新

这已在 tidyverse/dplyr 中提出已经并且似乎正在开发中,尽管尚未计划。

关于r - 为什么 mutate() 和 add_column() 不接受相同的基本参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48493383/

相关文章:

r - 在 Shiny 的应用程序中插入已编辑的数据表值

R Language : Error in read. table(file.path(data.dir, file_name1)):输入中没有可用的行

r - 使用 bookdown 时在列表项中正确缩进段落

R:在 dplyr join 后合并重复的列

r - 取一列中一起运行的数字的平均值

r - R 中分组数据帧中特定行号的总和列

r - 修改/添加列到嵌套的tibble

r - 无法计算条件均值

mysql - RMySQL - dbWriteTable() - 此 MySQL 版本不允许使用命令

arrays - 无法将 tibble 转换为 R 中的数组?