dplyr мутировать с помощью переменных столбцов
Я пытаюсь использовать 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: использовать имена динамических переменных. Я не смог адаптировать решение к моей проблеме.
2 ответа
Мы можем использовать imap_dbl
а также pluck
from the purrr package to achieve this task.
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.
Я не уверен, как это сделать с 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))]
}))