【问题标题】:column name in column -> copy specified column's value to single column列中的列名 -> 将特定列值复制到单个列
【发布时间】:2018-02-14 05:13:55
【问题描述】:

我有一个数据集,其中有一列中有列名,我想将该列的值复制到特定列。虽然我可以使用 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.

【问题讨论】:

  • Dekan : 难道只有my_mtcars$my_val &lt;- ifelse(my_mtcars$my_col == "mpg", my_mtcars$mpg, my_mtcars$hp) 应该给出想要的结果吗?
  • 这种方法会让我无法通过 my_mtcars$my_col 的所有可能值进行 if_else,这可能非常大(并且不是以编程方式动态)。

标签: r dplyr vectorization


【解决方案1】:

您可以使用矩阵访问器:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2017-08-13
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多