Замена значений в переменных фрейма данных из списка вложенных фреймов данных

Предположим, у меня есть следующий фрейм данных:

df <- data.frame(x = rnorm(10), y = rnorm(10), z = rnorm(10))

И я хотел бы заменить значения в переменных на соответствующий им фрейм данных и имена переменных в следующем списке:

replace_df <- list(x = data.frame(x = 1:10), 
                   y = data.frame(y = 11:20), 
                   z = data.frame(z = 21:30))

Как бы я это сделал, используя dplyr?

Я чувствую, что моя проблема связана с этими вопросами и ответами, но я не смог правильно применить ответы на этот вопрос в моей ситуации.

Я пробовал ниже, среди прочего, безуспешно:

library(tidyverse)
variables <- c("x", "y", "z")

df %>% 
  mutate_at(vars(variables), funs(replace_df[[.]][[.]]))

"Тупой" путь будет следующим:

df %>% 
  mutate(x = replace_df[["x"]][["x"]],
         y = replace_df[["y"]][["y"]],
         z = replace_df[["z"]][["z"]])

1 ответ

Решение

Вам нужно использовать expr! Я не уверен, что подмножество будет работать так, как вы пытались выше, но я смог получить правильный вывод, сделав простую функцию и передав аргумент, который был заключен в expr()

df <- data.frame(x = rnorm(10), y = rnorm(10), z = rnorm(10))

replace_df <- list(x = data.frame(x = 1:10), 
                   y = data.frame(y = 11:20), 
                   z = data.frame(z = 21:30))

my_func <- function(string) {

  return(
    replace_df[[string]][[string]]
  )

}

df %>% 
  mutate_at(vars(x, y, z), funs(my_func(expr(.))))
Другие вопросы по тегам