Линеаризовать данные в R (частично обращая XTABS) - PullRequest
1 голос
/ 31 января 2020

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

Мои входные данные выглядят так:

 INV  SUM Part1 Part2
   A   10    10     5
   B   10     8     8
   C   12    12     4

, и я ожидаю получить это:

INV Amt  Kind
  A  10   SUM
  A  10 Part1
  A   5 Part2
  B  10   SUM
  B   8 Part1
  B   8 Part2
  C  12   SUM
  C  12 Part1
  C   4 Part2

Это похоже на результат обратной функции XTABS ().

Сложный код, использующий FOR l oop, работает нормально, но требует обновления каждый раз, когда изменяется структура входных данных (т. Е. Столбец дополнительных функций добавлено).

У меня есть надежда, что есть простая функция. Пожалуйста, укажите такую ​​функцию или способ, отличный от FOR l oop. Спасибо.

1 Ответ

1 голос
/ 31 января 2020

Ваши данные:

DF = structure(list(INV = structure(1:3, .Label = c("A", "B", "C"), class = "factor"), 
    SUM = c(10L, 10L, 12L), Part1 = c(10L, 8L, 12L), Part2 = c(5L, 
    8L, 4L)), class = "data.frame", row.names = c(NA, -3L))

Использование библиотек tidyr и dplyr:

library(dplyr)
library(tidyr)
DF %>% pivot_longer(-INV)
# A tibble: 9 x 3
  INV   name  value
  <fct> <chr> <int>
1 A     SUM      10
2 A     Part1    10
3 A     Part2     5
4 B     SUM      10
5 B     Part1     8
6 B     Part2     8
7 C     SUM      12
8 C     Part1    12
9 C     Part2     4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...