Как создать фиктивные переменные, используя различные столбцы с одинаковыми уровнями и используя определенное значение столбца - PullRequest
0 голосов
/ 14 мая 2019

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

df1 <- structure(list(Value1 = c(9.330154398, 32.43881489, 54.77178387, 54.77178387),
                      Value2 = c(1, 2, 3, 8),
                      var1 = c("HomeATL", "AwaySDN", "AwayLAN", "AwayLAN"),
                      var2 = c("AwayHOU", "HomeATL", "HomeATL", "HomeATL"),
                      var3 = c("HomeEast", "HomeWest", "AwayEast", "AwayWest"),
                      var3values = c(1,2,3,4),
                      var4 = c("AwayWest", "AwayWest", "HomeSame", "HomeEast"),
                      var4values = c(5,6,7,8)), 
                 class = "data.frame", row.names = c(NA,-4L))

Результат должен выглядеть следующим образом:

Value1         Value2   HomeEast    HomeWest    AwayEast    AwayWest    HomeSame    HomeATL AwayHOU AwaySDN AwayLAN
9.330154398        1    1   0   0   5   0   1   1   0   0
-32.43881489       2    0   2   0   6   0   1   0   1   0
54.77178387        3    0   0   3   0   7   1   0   0   1
54.77178387        8    8   0   0   4   0   1   0   0   1

Я уже спрашивал что-то подобное, и подход, который я использовал, был:

library(tidyverse)
rownames_to_column(df1, 'rn') %>%
    gather(key, val, var1:var4) %>% 
    count(rn, val) %>%
    spread(val, n, fill = 0)  %>%
    select(-rn) %>%
    bind_cols(df1[1:2], .)

Однако, он возвращает фиктивные значения с 1 или 0, а не значения какого-либо предопределенного столбца.

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Можно указать gather столбцы, которые matches имя столбца начинается с 'var', за которым следуют одна или несколько цифр (\\d+) до конца ($) строки, сгруппированной по номер строки, столбец «val», создайте «n» на основе условия, указанного в case_when, т. е. если «ключ» равен «var3», то получите соответствующие значения «var3values» или «var4» , получите 'var4values' и, если они оба не соответствуют действительности, то получите счетчик частоты (n()), spread в "широком" формате и оставьте только интересующие столбцы

 rownames_to_column(df1, 'rn') %>%
    gather(key, val, matches("^var\\d+$")) %>%
    group_by(rn, val) %>% 
    mutate(n = case_when(key == "var3" ~ var3values, 
                         key == "var4" ~ var4values,
                         TRUE ~ as.numeric(n()))) %>% 
    select(-var3values, -var4values, -key) %>%
    spread(val, n, fill = 0) %>%  
    ungroup %>% 
    select(-rn)
# A tibble: 4 x 11
#  Value1 Value2 AwayEast AwayHOU AwayLAN AwaySDN AwayWest HomeATL HomeEast HomeSame HomeWest
#   <dbl>  <dbl>    <dbl>   <dbl>   <dbl>   <dbl>    <dbl>   <dbl>    <dbl>    <dbl>    <dbl>
#1   9.33      1        0       1       0       0        5       1        1        0        0
#2  32.4       2        0       0       0       1        6       1        0        0        2
#3  54.8       3        3       0       1       0        0       1        0        7        0
#4  54.8       8        0       0       1       0        4       1        8        0        0
0 голосов
/ 14 мая 2019

Вот как бы я это сделал

one <- df1 %>% select(var1:var2) %>% rownames_to_column('rn') %>% 
gather(key, val, var1:var2) %>% mutate(key = 1) %>% 
spread(val, key, fill = 0) %>% select(-rn)


two <- df1 %>% select(var3:var3values) %>% rownames_to_column('rn') %>% rename(var = 
var3, values = var3values)  %>% 
 bind_rows(df1 %>% 
          select(var4:var4values) %>% 
          rownames_to_column('rn') %>% 
          rename(var = var4, values = var4values)) %>% 
  spread(var, values, fill = 0) %>% 
  select(-rn)

  three <- df1 %>% select(1,2) 

    cbind(three, two, one)
...