【发布时间】: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 <- ifelse(my_mtcars$my_col == "mpg", my_mtcars$mpg, my_mtcars$hp)应该给出想要的结果吗? -
这种方法会让我无法通过 my_mtcars$my_col 的所有可能值进行 if_else,这可能非常大(并且不是以编程方式动态)。
标签: r dplyr vectorization