【问题标题】:dplyr mutate using variable columnsdplyr 使用可变列进行变异
【发布时间】:2018-08-24 22:45:27
【问题描述】:

我正在尝试使用 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。我无法根据我的问题调整解决方案。

【问题讨论】:

    标签: r dplyr tidyverse nse quosure


    【解决方案1】:

    我们可以使用 包中的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.
    

    【讨论】:

      【解决方案2】:

      我不确定如何单独使用 tidyverse 成语(尽管我认为有办法)。但是这里有一个使用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))]
        }))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-24
        • 2014-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多