列中的列名称 - >将指定列的值复制到单个列

时间:2018-02-14 05:13:56

标签: r dplyr vectorization

我有一个数据集,我在列中有列名,我想将该列的值复制到特定列。虽然我可以使用purrrly :: by_row()或apply()执行此操作,但这似乎效率低下,如果可能的话,我正在寻找更加向量化的解决方案。

这是我在“my_col”中有列名的设置:

suppressPackageStartupMessages(library("dplyr"))
suppressPackageStartupMessages(library("purrrlyr"))
suppressPackageStartupMessages(library("tibble"))

my_mtcars <- mtcars %>% 
        rownames_to_column() %>%
        select(rowname, cyl, mpg, hp) %>%
        mutate(my_col = if_else(cyl == 6, "mpg", "hp"))

数据集如下所示:

               rowname cyl  mpg  hp my_col
1            Mazda RX4   6 21.0 110    mpg
2        Mazda RX4 Wag   6 21.0 110    mpg
3           Datsun 710   4 22.8  93     hp
4       Hornet 4 Drive   6 21.4 110    mpg
...

这是一个简单地为每一行调用一个函数的解决方案,将“my_col”中指定的列的值放到“my_val”中:

purrrlyr::by_row(my_mtcars, .collate="rows", .to="my_val",
                 function(x) { x[[ x[["my_col"]] ]] })

   rowname             cyl   mpg    hp my_col my_val
 1 Mazda RX4          6.00  21.0 110   mpg      21.0
 2 Mazda RX4 Wag      6.00  21.0 110   mpg      21.0
 3 Datsun 710         4.00  22.8  93.0 hp       93.0
 4 Hornet 4 Drive     6.00  21.4 110   mpg      21.4
 ...

我担心上面的by_row()方法非常低效,因为我基本上遍历每一行。有更高效/矢量化的解决方案吗?

我注意到dplyr :: mutate()在索引到.data代词时不允许向量。例如,以下内容不起作用:

mutate(my_mtcars, my_val = .data[[ .data[["my_col"]] ]])
Error in mutate_impl(.data, dots) : 
  Evaluation error: Must subset with a string.

1 个答案:

答案 0 :(得分:0)

您可以使用矩阵访问器:

ind <- cbind(seq_len(nrow(my_mtcars)), 
             match(my_mtcars[["my_col"]], names(my_mtcars)))
my_mtcars$my_val <- my_mtcars[ind]