Как использовать R и dplyr для вставки имени столбца в качестве значения для поиска - PullRequest
1 голос
/ 22 октября 2019

Я использую выходные коэффициенты из модели регрессии glm, и мне нужно создать значение поиска, используя вставку ключа ([имя столбца]. [Уровень фактора], а затем вернуть соответствующее значение из другой таблицы данных. Столбецимена должны быть динамическими, чтобы мне не приходилось называть каждый столбец одно за другим. Возвращенные значения из поиска затем умножаются на 1 (для факторов) или на фактические числовые значения, а все имена coef_colname суммируются в столбце Total.

Я сделал несколько примеров в Excel, но не могу воспроизвести их в R. var_Factor1 объединяет имя столбца и уровень фактора из каждой строки (используя вставку), чтобы создать ключ для поиска следующего шага

var_Number1 - это просто имя столбца, так как оно числовое и не имеет уровней факторов

library(dplyr)

# original data
dt = data.table(
  Factor1  = c("A","B","C"),
  Number1 = c(10, 20,40),
  Factor2 = c("D","H","N"),
  Number2 = c(2, 5,3)
)

# Lookup table
model_coef = data.table(
    Factor1.A   = 10,
    Factor1.B   = 20,
    Factor1.C   = 30,
    Factor2.D   = 40,
    Factor2.H   = 50,
    Factor2.N   = 60,
    Number1 = 200,
    Number2 = 500
)

#initial steps
dt <- dt %>% mutate (
  var_Factor1 = paste("Factor1", Factor1, sep =".")
, var_Number1 = "Number1"
, var_Factor2 = paste("Factor2", Factor2, sep =".")
, var_Number2 = "Number2"
) %>% mutate (
    coef_Factor1 = model_coef[,var_Factor1]
)

#The final output should produce (as replicated from Excel)


final_output = data.table (
  Factor1= c("A", "B", "C"),
  Number1= c(10, 20, 40),
  Factor2= c("D", "H", "N"),
  Number2= c(2, 5, 3),
  var_Factor1= c("Factor1.A", "Factor1.B", "Factor1.C"),
  var_Number1= c("Number1", "Number1", "Number1"),
  var_Factor2= c("Factor2.D", "Factor2.H", "Factor2.N"),
  var_Number2= c("Number2", "Number2", "Number2"),
  coef_Factor1= c(10, 20, 30),
  coef_Number1= c(200, 200, 200),
  coef_Factor2= c(40, 50, 60),
  coef_Number2= c(500, 500, 500),
  calc_Factor1= c(10, 20, 30),
  calc_Number1= c(2000, 4000, 8000),
  calc_Factor2= c(40, 50, 60),
  calc_Number2= c(1000, 2500, 1500),
  Total= c(3050, 6570, 9590)
)

1 Ответ

0 голосов
/ 23 октября 2019

Обычно плохая идея пытаться генерировать и манипулировать динамическими столбцами. Вероятно, будет лучше использовать аккуратные соглашения об использовании данных и сделать их «длинными». Кроме того, похоже, что вы пытаетесь смешать data.table и dplyr / tidyverse. В частности, это не работает: mutate (coef_Factor1 = model_coef[,var_Factor1]

Я убрал ваши данные и изменил ваш код для использования dplyr / tidyverse ниже:

  • , используя tibble вместо данных. table
  • перестроил таблицу поиска в формат tidy-long, чтобы ее можно было правильно присоединить к вашей таблице
  • использовал mutate для выполнения описанных вами вычислений

Помимо вашего примера, если у вас есть более 2 «чисел» / «факторов» (кстати, ваше именование / маркировка / нумерация вводит в заблуждение), есть способы дальнейшего обобщения, чтобы код умножал число coef * в общем для каждого «числа»/ сочетание. Кроме того, ваши данные подразумевают, но неясно, что A связано с D, B связано с H и т. Д.

library(tidyverse)

data <- tibble(Factor1  = c("A","B","C"),Number1 = c(10, 20,40),Factor2 = c("D","H","N"),Number2 = c(2, 5,3))
model_coef <- tibble(Factor1.A   = 10,Factor1.B   = 20,Factor1.C   = 30,Factor2.D   = 40,Factor2.H   = 50,Factor2.N   = 60,Number1 = 200,Number2 = 500)

(model_coef_factor1 <- model_coef %>%
    select(Factor1.A:Factor1.C) %>%
    pivot_longer(cols = everything(), names_to = c("number", "factor"), names_sep = "[.]", values_to = "coef_factor1") %>%
    select(-number))
#> # A tibble: 3 x 2
#>   factor coef_factor1
#>   <chr>         <dbl>
#> 1 A                10
#> 2 B                20
#> 3 C                30

(model_coef_factor2 <- model_coef %>%
    select(Factor2.D:Factor2.N) %>%
    pivot_longer(cols = everything(), names_to = c("number", "factor"), names_sep = "[.]", values_to = "coef_factor2") %>%
    select(-number))
#> # A tibble: 3 x 2
#>   factor coef_factor2
#>   <chr>         <dbl>
#> 1 D                40
#> 2 H                50
#> 3 N                60

(final_output <- data %>%
    left_join(model_coef_factor1, by = c("Factor1"="factor")) %>%
    left_join(model_coef_factor2, by = c("Factor2"="factor")) %>%
    mutate(coef_number1 = model_coef$Number1,
           coef_number2 = model_coef$Number2,
           calc_factor1 = coef_factor1,
           calc_number1 = Number1 * coef_number1,
           calc_factor2 = coef_factor2,
           calc_number2 = Number2 * coef_number2,
           total = calc_factor1 + calc_number1 + calc_factor2 + calc_number2) %>%
    select(total, everything()))
#> # A tibble: 3 x 13
#>   total Factor1 Number1 Factor2 Number2 coef_factor1 coef_factor2
#>   <dbl> <chr>     <dbl> <chr>     <dbl>        <dbl>        <dbl>
#> 1  3050 A            10 D             2           10           40
#> 2  6570 B            20 H             5           20           50
#> 3  9590 C            40 N             3           30           60
#> # ... with 6 more variables: coef_number1 <dbl>, coef_number2 <dbl>,
#> #   calc_factor1 <dbl>, calc_number1 <dbl>, calc_factor2 <dbl>,
#> #   calc_number2 <dbl>

Создано в 2019-10-23 Представить пакет (v0.3.0)

...