Произвольная выборка каждого файла данных в моем списке перед их привязкой к фрейму данных с помощью R - PullRequest
0 голосов
/ 16 июня 2020

нужна помощь по моей задаче. Итак, у меня есть папка из 121 файла .txt. Каждый размером около 10 МБ. Для каждого файла .txt у них почти одинаковые столбцы / заголовки и разные строки. Я обнаружил разницу в заголовках столбцов только вчера, и это может быть связано с тем, что машина, генерирующая файл .txt, использует много специальных символов в заголовке, поэтому, когда я их читаю, происходит забавное дело.

Я хотел бы прочитать все файлы в папке, а затем объединить их в один большой файл для последующего анализа. Теперь, когда у меня есть две другие проблемы, их размер и потенциальное несоответствие размеров привели к сбою кода fread (). Я хотел бы найти функцию, которая могла бы правильно читать в большом количестве файлов .txt. Во-вторых, я хочу произвести случайную выборку, скажем, 20% каждого файла после их чтения, и использовать эти 20% для объединения файла .csv для последующей обработки. Я не новичок, поэтому до сих пор операции со списками всегда были концептуально сложными. А потом, в конце концов, rbind не сработал, так как некоторые размеры файла несовместимы. Я использовал gtools и smartbind, чтобы обойти. Но тогда, аналогично случайной выборке перед созданием массивного файла, могу ли я также подгруппировать столбцы с 1 по 131 в каждом считываемом файле?

вот мой код, который медленно читает все файлы и объединяет их в большой .csv. Пожалуйста, просветите меня.

setwd("C:/Users/mli/Desktop/3S_DMSO")
library(gtools)
# Create list of text files
txt_files_ls = list.files(pattern="*.txt") 
# Read the files in, assuming comma separator
txt_files_df <- lapply(txt_files_ls, function(x) {read.csv(file = x, header = T, sep ="\t")})
# Combine them
combined_df <- do.call("smartbind", lapply(txt_files_df, as.data.frame))

write.csv(combined_df,"3SDMSO_merged.csv",row.names = F)

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

Вы можете попробовать использовать функции чтения и записи из data.table. fread имеет действительно классную функцию автозапуска, которая разумно выбирает столбцы и информацию заголовка.

library(data.table)
setwd("C:/Users/mli/Desktop/3S_DMSO")
txt_files_ls = list.files(pattern="*.txt") 
txt_files_df <- lapply(txt_files_ls, fread)
sampled_txt_files_df <- lapply(txt_files_df,function(x){
  x[sample(1:nrow(x), ceiling(nrow(x) * 0.2)),1:131]
  })
combined_df <- rbindlist(sampled_txt_files_df)
fwrite(combined_df,"3SDMSO_merged.csv",row.names = FALSE)
0 голосов
/ 16 июня 2020
...
txt_files_df <- lapply(txt_files_ls, function(x) {
  # fread with fill=T usually works. if not, go back to read.csv
  fread(file = x, header = T, sep ="\t", fill=T)[sample(round(.2*.N))] # keep 20% of rows
})
# rbindlist with use.names=T,fill=T usually works. if not, preprocess above or go back to smartbind
combined_df <- rbindlist(txt_files_df,use.names=T,fill=T)
## Keep only columns 1 - 131
# if you don't use fread, then convert to data.table so the column selection below works:
# setDT(combined_df)
combined_df = combined_df[,1:131]
...

Нужно быстрее? см. { ссылка }

...