Как определить первый столбец перед импортом и связать (rbindlist) в R - PullRequest
0 голосов
/ 07 октября 2019

Цель

импортировать и связать список файлов xlsx с непредсказуемым нерелевантным первым столбцом. (Необходимо удалить его, но вы не знаете, какой файл содержит нерелевантный первый столбец.)

# sample : remind that the xlsx file originally don't have any column names

    DT1 = data.table(a = c("TYPE","X","Y","Z"), b = c("MONTH","Jan","Feb","Mar"))
    DT2 = data.table(a = c(NA,NA,NA,"random_irrelevant_vale") ,b = c("TYPE","X","Y","W"), c = c("MONTH","Apr","Feb","May"))

# give "idcol" & col_names = FALSE is a must
    PATH_LIST<- list.files(path = "PATH",
                               pattern = "*.xlsx",full.names = TRUE)
    names(PATH_LIST) <- basename(PATH_LIST)

    rbindlist(lapply(PATH_LIST,import,col_names = FALSE,
                             col_types = "text"),
                      idcol = "source",fill = TRUE) 

    # EXPECTED OUTPUT
    TYPE MONTH
    X    Jan
    Y    Feb
    Z    Mar
    X    Apr
    Y    Feb
    W    May
  • Невозможно просто использовать! Grepl ("random_irrevelevant_value", x), поскольку "random_irrevelevant_value" является случайнымзначение.

Как мне добиться этого между этапом импорта и связать их?

1 Ответ

1 голос
/ 07 октября 2019

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

DTls <- lapply(list.files(pattern="DT(.*).csv"), fread, header=FALSE)
m <- min(lengths(DTls))
rbindlist(
    lapply(DTls, function(DT) {
        cols <- head(names(DT), length(DT)-m)
        if (length(cols) > 0)
            DT[, (cols) := NULL]
        DT
    })
)

output:

     V1    V2
1: TYPE MONTH
2:    X   Jan
3:    Y   Feb
4:    Z   Mar
5: TYPE MONTH
6:    X   Apr
7:    Y   Feb
8:    W   May

файлы данных:

library(data.table)
DT1 = data.table(a = c("TYPE","X","Y","Z"), b = c("MONTH","Jan","Feb","Mar"))
DT2 = data.table(a = c(NA,NA,NA,"random_irrelevant_vale") ,b = c("TYPE","X","Y","W"), c = c("MONTH","Apr","Feb","May"))
fwrite(DT1, "DT1.csv", col.names=FALSE)
fwrite(DT2, "DT2.csv", col.names=FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...