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))]
  }))
Другие вопросы по тегам