R, импортируя файлы фиксированной ширины, которые должны быть привязаны к строке, но имеют разную ширину

133
16

Работал с некоторыми грязными данными. У меня есть 72 файла: 9 (CCLF1-CCLF9), разделенные на 8 частей. Каждый файл является файлом фиксированной ширины, и у меня есть словарь подходящих имен ширины и столбца, которые я извлекаю из таблицы Excel.

Проблема в том, что после загрузки их я понял, что есть файлы с дополнительными 11 символами. Таким образом, это приводит к неправильной привязке.

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

Например, файл CCLF1 должен иметь ширину 177, но 5 его подфайлов имеют ширину 188. Я хочу проверить, равен ли он 177, если да, добавьте 11 символов, иначе загрузите файл.

Я просто не знаю, как это сделать. Вот что я до сих пор загружал в данные:

  # Pull in the CCLF Details xlsx and put them into a list
details_path <- paste0(mappingPath,"CCLF Dictionary.xlsx")
sheetnames <- excel_sheets(details_path)
CCLF_details <- lapply(sheetnames,read_excel, path = details_path)
names(CCLF_details) <- sheetnames

# Extract the column width and column labels vectors from the xlsx
widths <- unname(sapply(CCLF_details,'[[',"COLUMN_WIDTH", drop = FALSE))
correct_widths <- lapply(widths,sum)
col_labels <- unname(sapply(CCLF_details,'[[',"CLAIM_FIELD_LABEL", drop = FALSE))

# Set up group names for the CCLF Files (CCLF1-CCLF9)
CCLF_files <- paste("CCLF",seq(1:9),sep = "")

proc_files <- function(f, w, y) {

# Get files with Current CCLF# in name
files <- list.files(pattern = f)

# Build a list of data tables from all CCLF# files and pull in the proper widths and column names
df_list <- lapply(files, function(x) read_fwf(x, fwf_widths(widths = w, col_names = y ), na = c("","NA","~","1000-01-01","9999-12-31")))

# Bind all of the CCLF# files into one main file
df <- rbindlist(df_list, fill = TRUE)
}

# Create a list of all the CCLF Files
df_list <- Map(proc_files,CCLF_files,as.vector(widths),as.vector(col_labels))

спросил(а) 2021-01-25T18:23:09+03:00 4 месяца, 4 недели назад
1
Решение
76

Операции с вектором велики, когда каждая операция одинакова, но когда есть исключения, я рекомендую цикл for. Что-то вроде этого. Схема filenaming меня смутила, поэтому исправьте области "..."

filenames <- ...   
for(i in 1:length(filenames)){
data = ... read in filenames[i]
num_characters = ...
if(num_characters == 177){
... fix the width ...
df_list[[i]] = data
}else{
df_list[[i]] = data
}
}
df <- rbindlist(df_list, fill = TRUE)

ответил(а) 2021-01-25T18:23:09+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема