Мне нужен подход к динамически преобразованию набора данных Cascade в normal Table набор данных.
Условия подхода:
- Это данные XLSX
- Первый столбец не заполнен (нет данных)
- Индекс конца столбца неизвестен
- Создание идентификатора столбца для имени файла при импорте
Код для генерации набора данных 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 столбца или меньше)
Есть ли эффективный подход, способный решить эту проблему с этими ограничениями?