Как создать различия между несколькими парами столбцов? - PullRequest
1 голос
/ 08 апреля 2019

У меня есть набор данных панели (сечение временного ряда). Для каждой группы (определяемой (NAICS2, occ_type) во времени ym) у меня есть много переменных. Для каждой переменной я бы хотел вычесть первое (dplyr::first) значение каждой группы из каждого значения этой группы . В конечном итоге я пытаюсь взять евклидово различие между вектором первой записи каждой группы в строке (то есть sqrt (c_1 ^ 2 + ... + c_k ^ 2).

Мне удалось создать столбец, равный первым записям для каждой группы:

df2 <- df %>% 
  group_by(ym, NAICS2, occ_type) %>% 
  distinct(ym, NAICS2, occ_type, .keep_all = T) %>% 
  arrange(occ_type, NAICS2, ym) %>% 
  select(group_cols(), ends_with("_scf")) %>% 
  mutate_at(vars(-group_cols(), ends_with("_scf")), 
            list(first = dplyr::first))

Затем я попытался включить варианты f.diff = . - dplyr::first(.) в список, но ни один из них не сработал. Я некоторое время гуглял с точечной нотацией, а также с первым и отстал в временных рядах dplyr, но пока не смог решить эту проблему.

В идеале я сначала объединяю все переменные в вектор для каждой строки, а затем беру разницу.

df2 <- df %>% 
  group_by(ym, NAICS2, occ_type) %>% 
  distinct(ym, NAICS2, occ_type, .keep_all = T) %>% 
  arrange(occ_type, NAICS2, ym) %>% 
  select(group_cols(), ends_with("_scf")) %>% 
  unite(vector, c(-group_cols(), ends_with("_scf")), sep = ',') %>%
# TODO: DISTANCE_BETWEEN_ENTRY_AND_FIRST
  mutate(vector.diff = ???)

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

Вот пример данных:

structure(list(ym = c("2007-01-01", "2007-02-01"), NAICS2 = c(0L, 
0L), occ_type = c("is_middle_manager", "is_middle_manager"), 
    Administration_scf = c(344, 250), Agriculture..Horticulture..and.the.Outdoors_scf = c(11, 
    17), Analysis_scf = c(50, 36), Architecture.and.Construction_scf = c(57, 
    51), Business_scf = c(872, 585), Customer.and.Client.Support_scf = c(302, 
    163), Design_scf = c(22, 17), Economics..Policy..and.Social.Studies_scf = c(7, 
    7), Education.and.Training_scf = c(77, 49), Energy.and.Utilities_scf = c(25, 
    28), Engineering_scf = c(90, 64), Environment_scf = c(19, 
    19), Finance_scf = c(455, 313), Health.Care_scf = c(105, 
    71), Human.Resources_scf = c(163, 124), Industry.Knowledge_scf = c(265, 
    174), Information.Technology_scf = c(467, 402), Legal_scf = c(21, 
    17), Maintenance..Repair..and.Installation_scf = c(194, 222
    ), Manufacturing.and.Production_scf = c(176, 174), Marketing.and.Public.Relations_scf = c(139, 
    109), Media.and.Writing_scf = c(18, 20), Personal.Care.and.Services_scf = c(31, 
    16), Public.Safety.and.National.Security_scf = c(14, 7), 
    Religion_scf = c(0, 0), Sales_scf = c(785, 463), Science.and.Research_scf = c(52, 
    24), Supply.Chain.and.Logistics_scf = c(838, 455), total_scf = c(5599, 
    3877)), class = c("grouped_df", "tbl_df", "tbl", "data.frame"
), row.names = c(NA, -2L), groups = structure(list(ym = c("2007-01-01", 
"2007-02-01"), NAICS2 = c(0L, 0L), occ_type = c("is_middle_manager", 
"is_middle_manager"), .rows = list(1L, 2L)), row.names = c(NA, 
-2L), class = c("tbl_df", "tbl", "data.frame"), .drop = TRUE))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...