R: поиск несоответствующих имен столбцов перед объединением - PullRequest
2 голосов
/ 19 октября 2019

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

#create data
df1 <- data.frame("col1" = 3:4, "Age" = c(22,16), "Name" = c("James","Jim"))
df2 <- data.frame("col1" = 3:4, "Age" = c(18,19), "Name" = c("Mike","Mia"))
df3 <- data.frame("mismatch_col_name_1" = 1:2, "Age" = c(21,15), "name" = c("John","Dora"))
df4 <- data.frame("mismatch_col_name_2" = 1:2, "Age" = c(21,15), "Name" = c("John","Dora"))
files <- list(df1, df2, df3, df4)

# find mismatched column names
mismatches <- NULL
for (i in 1:(length(files) - 1)) {
  mismatches <- c(mismatches, setdiff(colnames(files[[i]]), colnames(files[[i+1]])))
}
mismatches <- c(mismatches, setdiff(colnames(files[[length(files)]]), colnames(files[[1]])))
print(mismatches)

[1] "col1"                "Name"                "mismatch_col_name_1" "name"               
[5] "mismatch_col_name_2"

Желаемый вывод будет выглядеть примерно так:

"df3" "mismatch_col_name_1" "name"

"df4" "mismatch_col_name_2" "Name"

Или даже имена df и номера столбцов. Заинтересованы в любых решениях или лучшие способы сделать это.

1 Ответ

2 голосов
/ 19 октября 2019

Вот подход, который приводит вас к списку (в смысле R), содержащему несоответствия для каждого файла. Он основан на предположении, что вы знаете «истинный» набор имен, с которым сравнивать каждый файл.

lapply(files, function(x) {

    # vector of desired names
    master <- c('col1', 'Age', 'Name')

    # use 'match' to compare this df's names to the master. the order of the
    # cols won't matter; if the name in x appears in master, 'match' will return
    # an integer indicating the position of the col with that name in x.
    comparison <- match(names(x),  master)

    # if all col names in x appear in master, you get all integers, so: NULL
    if (!any(is.na(comparison))) {

        NULL

    # if names in x don't appear in master, you get an NA from 'match', so here you
    # create a vector of the names in x that aren't in master. You could also capture
    # their position here if that's helpful.
    } else {

        mismatches <- names(x)[which(is.na(comparison))]

    }

})

Результат:

[[1]]
NULL

[[2]]
NULL

[[3]]
[1] "mismatch_col_name_1" "name"               

[[4]]
[1] "mismatch_col_name_2"

Существуют различные способы упорядочения или суммирования содержимого этого списка, но в основном это вопрос форматирования.

...