R не может обнаружить, что у меня есть более одного столбца в загруженных файлах - PullRequest
0 голосов
/ 17 октября 2018

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

Example of my data table

Я пытаюсь выполнить это, используя fread в цикле for:

library(data.table)
## I need to write this script to reorder the column headers which are now apparently out of wack
## I just need to shift them over one
filelist <- list.files(pattern = ".*.txt")

for(i in 1:length(filelist)){
  assign(filelist[[i]], fread(filelist[[i]], fill = TRUE))
  names(filelist[[i]]) <- c("RowID", "rsID", "PosID", "Link", "Link.1","Direction", "Spearman_rho", "-log10(p)")
}

Однако я продолжаю получатьследующее или вариант следующего сообщения об ошибке:

Error in names(filelist[[i]]) <- c("RowID", "rsID", "PosID", "Link", "Link.1",  : 
  'names' attribute [8] must be the same length as the vector [1]

, что меня смущает, потому что, как вы можете ясно видеть выше, R Studio может загружать файлы с правильным количеством столбцов.Тем не менее, сообщение об ошибке означает, что существует только один столбец.Я пробовал разные функции, такие как colnames, и даже пытался определить разделитель как кавычки (так как мои файлы были ранее сгенерированы другим R-скриптом, который разделял записи в кавычках), но не повезло.На самом деле, если я пытаюсь определить разделитель следующим образом:

for(i in 1:length(filelist)){
  assign(filelist[[i]], fread(filelist[[i]], sep = "\"", fill = TRUE))
  names(filelist[[i]]) <- c("RowID", "rsID", "PosID", "Link", "Link.1","Direction", "Spearman_rho", "-log10(p)")
}

, я получаю следующую ошибку:

Error in fread(filelist[[i]], sep = "\"", fill = TRUE) : 
  sep == quote ('"') is not allowed

Любая помощь будет принята.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Мне кажется, проблема в том, что, несмотря на название, 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 - нестандартные имена столбцов (с паренами и -) обычно доставляют больше хлопот, чем стоят.

0 голосов
/ 17 октября 2018

Не могли бы вы запустить следующий код, чтобы ближе рассмотреть то, что вы помещаете в список файлов?

i <- 1
assign(filelist[[i]], fread(filelist[[i]], fill = TRUE))
print(filelist[[i]])

Я подозреваю, что вам может понадобиться использовать приведенный ниже код вместо оператора присваивания

filelist[[i]] <- fread(filelist[[i]], fill = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...