Как динамически преобразовать данные Tree + Cascade в форму таблицы в R? - PullRequest
0 голосов
/ 07 сентября 2018

Мне нужен подход к динамически преобразованию набора данных Cascade в normal Table набор данных.

Условия подхода:

  1. Это данные XLSX
  2. Первый столбец не заполнен (нет данных)
  3. Индекс конца столбца неизвестен
  4. Создание идентификатора столбца для имени файла при импорте

Код для генерации набора данных Cascade

DT <- data.table(X__1 = NA,
                 X__2 = c("A_GROUP","","","","","","","","","",""),
                 X__3 = c("JOHN","","","","","","","","","",""),
                 X__4 = c("","RED_TEAM","","GREEN_TEAM","","","","","","",""),
                 X__5 = c("","MARRY","TOM","PAUL","SAM","","","","",""),
                 X__6 = c("","","","","","A_LINE","","B_LINE","","C_LINE"),
                 X__7 = c("","","","","","JAMES","FAN","DEN","JOE","LAW","GEM"))

Вы можете увидеть структуру, как показано ниже:

  • Четные числа в терминах имени столбца представляют информацию о группе (нечетное числа в пересчете на общий столбец индекса набора данных)
  • Нечетные числа в терминах имени столбца представляют информацию «Имя» (1-й Столбец является NA) (четные числа с точки зрения общего столбца набора данных индекс)
  • Одна строка содержит только один тип информации о группе

У меня наивный подход , но я не могу справиться с размером фрукта , когда каждый раз импортирую новые данные

library(rio)
library(data.table)
library(dplyr)

PATH <- "~/CASCDE.xlsx"
names(PATH) <- basename(PATH)
DT <- rbindlist(lapply(PATH,import,col_names = FALSE,
                       col_types = "text"),
                  idcol = "source",fill = TRUE)
# Shift all NAME info in one column
 # Cannot use NA instead of "",because R recognize many EXCEL blank as "" not NA 
DT2 <- DT[,NAME_INFO := ifelse(!X__3 == "",X__3,
                                    ifelse(!X__5 == "",X__5,
                                           ifelse(!X__7 == "",X__7,
                                                  "Nothing")))]
# Reshape all GROUP info to another columns
DT2[,`:=`(GROUP = ifelse(!X__2 == "",X__2,NA),
           TEAM = ifelse(!X__4 == "",X__4,NA),
           LINE = ifelse(!X__6 == "",X__6,NA))]

DT2 <- DT2 %>% fill(GROUP,TEAM,LINE) %>%
  as.data.table()
DT2[is.na(DT2)] <- "-" # Represent there in no info
DT2 <- DT2[,!2:7] # Remove the original Cascade part

В этом случае у меня есть 7 столбцов, но иногда данные содержат 9 столбцов, которые непредсказуемо . (Единственная подтвержденная логика - данные, приносящие + + 2 столбца или меньше)

Есть ли эффективный подход, способный решить эту проблему с этими ограничениями?

...