Мне кажется, проблема в том, что, несмотря на название, list.files
возвращает символьный вектор, а не list
.Так что использование [[
не правильно.Затем с помощью assign
вы создаете объекты, имена которых совпадают с именами файлов (не очень хорошая практика, было бы лучше использовать список).Затем вы пытаетесь изменить имена созданного объекта, но только с использованием символьной строки имени объекта.Чтобы использовать объект, имя которого находится в символьной строке, вам нужно использовать get
(что является частью того, почему использование list
лучше, чем создание группы объектов).
Чтобы быть более точным, скажем, что filelist = c("data1.txt", "data2.txt")
.Затем, когда i = 1
, этот код: assign(filelist[[i]], fread(filelist[[i]], fill = TRUE))
создает таблицу данных с именем data1.txt
.Но ваша следующая строка, names(filelist[[i]]) <- ...
, не изменяет вашу таблицу данных, она изменяет первый элемент filelist
, который является строкой "data1.txt"
, и эта строка действительно имеет длину 1
.
Я рекомендую читать ваши файлы в список вместо использования assign
для создания объектов.
filelist <- list.files(pattern = ".*.txt")
datalist <- lapply(filelist, fread, fill = TRUE)
names(datalist) <- filelist
Для изменения имен вы можете использовать data.table::setnames
вместо:
for(dt in datalist) setnames(dt, c("RowID", "rsID", "PosID", "Link", "Link.1","Direction", "Spearman_rho", "-log10(p)"))
Однако, fread
имеет аргумент col.names
, так что вы можете просто сделать это непосредственно на этапе чтения:
my_names <- c("RowID", "rsID", "PosID", "Link", "Link.1","Direction", "Spearman_rho", "-log10(p)")
datalist <- lapply(filelist, fread, fill = TRUE, col.names = my_names)
Я бы также предложил , а не , используя "-log10(p)"
в качестве столбцаname - нестандартные имена столбцов (с паренами и -
) обычно доставляют больше хлопот, чем стоят.