我有一个数据集,我在列中有列名,我想将该列的值复制到特定列。虽然我可以使用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.
答案 0 :(得分:0)
您可以使用矩阵访问器:
ind <- cbind(seq_len(nrow(my_mtcars)),
match(my_mtcars[["my_col"]], names(my_mtcars)))
my_mtcars$my_val <- my_mtcars[ind]