Используйте имена в одном df для создания копий столбцов другого фрейма данных - PullRequest
4 голосов
/ 10 июля 2019
df <- structure(list(Cars = structure(3:1, .Label = c("Ford ", "Mazda", "Merc"), class = "factor"), Model = structure(c(2L, 1L, 3L), .Label = c("c", "e-class", "gt"), class = "factor"), Color = structure(1:3, .Label = c("Black ", "Blue", "Red"), class = "factor")), class = "data.frame", row.names = c(NA, -3L))
argument <- structure(list(NewVar = structure(3:2, .Label = c("", "SKU", "Vehicle"), class = "factor"), Input = structure(2:3, .Label = c("", "Cars", "Model"), class = "factor")), row.names = 1:2, class = "data.frame")
after <- structure(list(Cars = structure(3:1, .Label = c("Ford ", "Mazda", "Merc"), class = "factor"), Model = structure(c(2L, 1L, 3L), .Label = c("c", "e-class", "gt"), class = "factor"), Color = structure(1:3, .Label = c("Black ", "Blue", "Red"), class = "factor"), Vehicle = structure(3:1, .Label = c("Ford ", "Mazda", "Merc"), class = "factor"), SKU = structure(c(2L, 1L, 3L), .Label = c("c", "e-class", "gt"), class = "factor")), class = "data.frame", row.names = c(NA, -3L))
df
#>    Cars   Model  Color
#> 1  Merc e-class Black 
#> 2 Mazda       c   Blue
#> 3 Ford       gt    Red
argument
#>    NewVar Input
#> 1 Vehicle  Cars
#> 2     SKU Model
after
#>    Cars   Model  Color Vehicle     SKU
#> 1  Merc e-class Black     Merc e-class
#> 2 Mazda       c   Blue   Mazda       c
#> 3 Ford       gt    Red   Ford       gt

Я пытаюсь выполнить цикл по столбцам и создать копию на основе аргумента data.frame. Это то, что я пытался, но на самом деле это не работает. У меня есть df, аргумент и после dputs. По сути, аргумент имеет столбец с заголовком «new var» и «input». В качестве аргумента у меня есть «Автомобиль» в «новом var» и «вход» в «Авто». Это означает, что в оригинале df скопируйте «Автомобили» и назовите его «Транспортное средство».
List является динамическим, поэтому я пытаюсь сохранить его для циклов, основанных на длине аргументов, то есть меняющихся, если я также хочу, чтобы цвет копировался как краска.

for (i in 1:length(argument$Input) ){
  df %>%   
  mutate( paste0(argument[i,1]) =  !!as.name(argument[i,2])
     }

Обратите внимание, argument[i,1] относится к input, поэтому «переменная» - это имя нового столбца. В dplyr это влияет на df, поэтому я подумал, что !!as.name вытащит ту переменную, которая уже существует, т. Е. "Автомобили" уже находятся внутри до df.

Ответы [ 2 ]

6 голосов
/ 10 июля 2019

Мы можем выбрать интересующие столбцы с помощью столбца «Вход» аргумента, а затем использовать rename_at для изменения имен столбцов.Столбцы набора данных 'аргумент' относятся к классу factor, преобразуйте его в character при внесении изменений.

library(dplyr)
df %>%
    mutate_at(vars(as.character(argument$Input)), list(new= ~ .)) %>% 
    rename_at(vars(matches('new')), ~ as.character(argument[[1]]))
#     Cars   Model  Color Vehicle     SKU
#1  Merc e-class Black     Merc e-class
#2 Mazda       c   Blue   Mazda       c
#3 Ford       gt    Red   Ford       gt

Если мы используем цикл OP for с :=,убедитесь, что вы оценили (!!) строки имен на lhs из :=

library(magrittr)
for(i in seq_len(nrow(argument))){
     df %<>%
         mutate(!! as.character(argument[[1]][i]) :=  
                 !! rlang::sym(as.character(argument[[2]][i])))
  }
4 голосов
/ 10 июля 2019

Вот базовая опция R, которую иногда проще использовать, когда у вас уже есть имена столбцов символов. Обратите внимание на приведение к характеру, поскольку предоставленные вами данные представлены в виде факторов.

library(tidyverse)
df <- structure(list(Cars = structure(3:1, .Label = c("Ford ", "Mazda", "Merc"), class = "factor"), Model = structure(c(2L, 1L, 3L), .Label = c("c", "e-class", "gt"), class = "factor"), Color = structure(1:3, .Label = c("Black ", "Blue", "Red"), class = "factor")), class = "data.frame", row.names = c(NA, -3L))
argument <- structure(list(NewVar = structure(3:2, .Label = c("", "SKU", "Vehicle"), class = "factor"), Input = structure(2:3, .Label = c("", "Cars", "Model"), class = "factor")), row.names = 1:2, class = "data.frame")
after <- structure(list(Cars = structure(3:1, .Label = c("Ford ", "Mazda", "Merc"), class = "factor"), Model = structure(c(2L, 1L, 3L), .Label = c("c", "e-class", "gt"), class = "factor"), Color = structure(1:3, .Label = c("Black ", "Blue", "Red"), class = "factor"), Vehicle = structure(3:1, .Label = c("Ford ", "Mazda", "Merc"), class = "factor"), SKU = structure(c(2L, 1L, 3L), .Label = c("c", "e-class", "gt"), class = "factor")), class = "data.frame", row.names = c(NA, -3L))

add_column <- function(df, new_col, existing_col) {
  new_col <- as.character(new_col)
  existing_col <- as.character(existing_col)
  df[[new_col]] <- df[[existing_col]]
  return(df)
}

for (i in 1:nrow(argument)) {
  df <- add_column(df, argument$NewVar[i], argument$Input[i])
}

df
#>    Cars   Model  Color Vehicle     SKU
#> 1  Merc e-class Black     Merc e-class
#> 2 Mazda       c   Blue   Mazda       c
#> 3 Ford       gt    Red   Ford       gt

Создано в 2019-07-10 пакетом Представления (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...