R-код, импортирующий файлы фиксированной ширины, которые должны быть связаны строкой, но имеют разную ширину - PullRequest
0 голосов
/ 13 сентября 2018

Работал с некоторыми грязными данными.У меня 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))

1 Ответ

0 голосов
/ 14 сентября 2018

Векторные операции хороши, когда каждая операция одинакова, но когда есть исключения я рекомендую для цикла. Что-то вроде этого. Схема именования файлов смутила меня, поэтому исправьте области '...'

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...