Создать таблицу из иерархии - PullRequest
0 голосов
/ 05 июля 2019

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

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

Мой ввод выглядит так:

input = structure(list(V1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L), .Label = "ASIA PACIFIC", class = "factor"), V2 = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "AUSTRALIA", class = "factor"), 
    V3 = structure(c(1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("ACT", 
    "NEW SOUTH WALES"), class = "factor"), V4 = structure(c(1L, 
    3L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 4L), .Label = c("CANBERRA", 
    "NEWCASTLE", "SYDNEY", "WOLLONGONG"), class = "factor"), 
    V5 = structure(c(9L, 2L, 6L, 4L, 7L, 3L, 5L, 8L, 10L, 1L), .Label = c("###", 
    "BONDI", "CAMPBELLTOWN", "GEORGE ST", "MAIN ST", "NEWTOWN", 
    "PITT ST", "POKOLBIN", "SMITH ST", "STRANGE PDE"), class = "factor"), 
    V6 = structure(c(1L, 2L, 3L, 1L, 1L, 5L, 1L, 4L, 1L, 1L), .Label = c("###", 
    "CHARLES AVE", "FRANCIS ST", "TOM ST", "TONY LANE"), class = "factor"), 
    V7 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "###", class = "factor")), class = "data.frame", row.names = c(NA, 
-10L))

И я хочу создать следующий вывод:

output = 
structure(list(V1 = structure(c(10L, 3L, 4L, 5L, 9L, 14L, 6L, 
13L, 11L, 15L, 2L, 12L, 8L, 7L, 1L), .Label = c("AUSTRALIA", 
"CANBERRA", "CHARLES AVE", "FRANCIS ST", "GEORGE ST", "MAIN ST", 
"NEW SOUTH WALES", "NEWCASTLE", "PITT ST", "SMITH ST", "STRANGE PDE", 
"SYDNEY", "TOM ST", "TONY LANE", "WOLLONGONG"), class = "factor"), 
    V2 = structure(c(6L, 4L, 9L, 11L, 11L, 5L, 8L, 10L, 8L, 7L, 
    1L, 7L, 7L, 3L, 2L), .Label = c("ACT", "ASIA PACIFIC", "AUSTRALIA", 
    "BONDI", "CAMPBELLTOWN", "CANBERRA", "NEW SOUTH WALES", "NEWCASTLE", 
    "NEWTOWN", "POKOLBIN", "SYDNEY"), class = "factor"), V3 = c(5L, 
    6L, 6L, 5L, 5L, 6L, 5L, 6L, 5L, 4L, 3L, 3L, 3L, 2L, 1L)), class = "data.frame", row.names = c(NA, 
-15L))

Я не имею понятия, что мне нужно искать, чтобы начать. Если кто-нибудь может подсказать, с чего начать, я был бы очень благодарен.

1 Ответ

2 голосов
/ 05 июля 2019

Обычно такие пропущенные значения представлены NA, но здесь они представлены ###, мы можем удалить их из каждой строки и выбрать два последних значения, используя tail и вернуть length(new_x).

as.data.frame(t(apply(input, 1, function(x) 
       {new_x = x[x != "###"]; c(rev(tail(new_x, 2)), length(new_x)) })))

#           V1              V2 V3
#1 CHARLES AVE           BONDI  6
#2  FRANCIS ST         NEWTOWN  6
#3   GEORGE ST          SYDNEY  5
#4     PITT ST          SYDNEY  5
#5   TONY LANE    CAMPBELLTOWN  6
#6     MAIN ST       NEWCASTLE  5
#7      TOM ST        POKOLBIN  6
#8 STRANGE PDE       NEWCASTLE  5
#9  WOLLONGONG NEW SOUTH WALES  4

A tidyverse подход к тому же может быть

library(tidyverse)

input %>%
  mutate(row = row_number()) %>%
  gather(col, value, -row) %>%
  filter(value != "###") %>%
  group_by(row) %>%
  mutate(last_value = row_number()) %>%
  slice(c(n(), n() - 1)) %>%
  mutate(col = c("col1", "col2"), 
        last_value = max(last_value)) %>%
  spread(col, value) %>%
  ungroup() %>%
  select(-row)

# A tibble: 9 x 3
#  last_value col1        col2           
#       <int> <chr>       <chr>          
#1          6 CHARLES AVE BONDI          
#2          6 FRANCIS ST  NEWTOWN        
#3          5 GEORGE ST   SYDNEY         
#4          5 PITT ST     SYDNEY         
#5          6 TONY LANE   CAMPBELLTOWN   
#6          5 MAIN ST     NEWCASTLE      
#7          6 TOM ST      POKOLBIN       
#8          5 STRANGE PDE NEWCASTLE      
#9          4 WOLLONGONG  NEW SOUTH WALES
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...