首页 文章

dplyr使用变量列进行变异

提问于
浏览
3

我正在尝试使用 mutate 创建一个包含基于特定列的值的新列 .

示例最终数据框(我正在尝试创建 new_col ):

x = tibble(colA = c(11, 12, 13),
           colB = c(91, 92, 93),
           col_to_use = c("colA", "colA", "colB"),
           new_col = c(11, 12, 93))

我想做的事情如下:

x %>% mutate(new_col = col_to_use)

除了列内容,我想将它们转换为变量 . 我开始时:

col_name = "colA"
x %>% mutate(new_col = !!as.name(col_name))

这适用于静态变量 . 但是,我无法更改变量来表示列 . 如何根据其他列的内容获取列名?

这个问题基本上与此相反:dplyr - mutate: use dynamic variable names . 我无法使解决方案适应我的问题 .

2 回答

  • 2

    我们可以使用purrr包中的 imap_dblpluck 来完成此任务 .

    library(tidyverse)
    
    x <- tibble(colA = c(11, 12, 13),
               colB = c(91, 92, 93),
               col_to_use = c("colA", "colA", "colB"))
    
    x2 <- x %>%
      mutate(new_col = imap_dbl(col_to_use, ~pluck(x, .x, .y)))
    
    x2
    # # A tibble: 3 x 4
    #   colA  colB col_to_use new_col
    #  <dbl> <dbl> <chr>        <dbl>
    # 1   11.   91. colA           11.
    # 2   12.   92. colA           12.
    # 3   13.   93. colB           93.
    
  • 3

    我不确定如何单独使用 tidyverse 成语(虽然我假设's a way). But here'是一个使用 apply 的方法:

    x$new_col = apply(x, 1, function(d) {
      d[match(d["col_to_use"], names(x))]
    })
    

    colA colB col_to_use new_col
    1 11 91 colA 11
    2 12 92 colA 12
    3 13 93 colB 93

    或者,将 apply 放在 mutate 内:

    x = x %>% 
      mutate(new_col = apply(x, 1, function(d) {
        d[match(d["col_to_use"], names(x))]
      }))
    

相关问题