Read.table неправильно интерпретирует количество столбцов в таблице

#r

#r

Вопрос:

Я новичок в R и пытаюсь массово вводить таблицы с 24 столбцами и только одной строкой.

Эти таблицы находятся в текстовом файле, выводимом с помощью функции print () из другого кода R и скрипта bash — я делаю это, потому что мне нужно выводить 1000 таких таблиц одновременно, и я хочу иметь возможность быстро их сканировать. Выходные данные, как упоминалось выше, содержат много столбцов, но одну строку, и когда они находятся в текстовом файле, таблица растекается на несколько строк.

Вот пример таблицы, измененной для простоты — на самом деле есть несколько дополнительных столбцов, которые приводят к большему количеству строк, но все равно есть только одна строка, и имя каждого столбца — «columnx» (в реальной вещи повторяющиеся имена отсутствуют.)

Пример подобной таблицы

Один из способов, которым я ввел таблицу в R, используя read.table, а затем установил для «header» и «fill» значение TRUE. (Я также возился с readLines, readCVS, scan и т. Д., Но read.table — лучший результат на данный момент.) Однако, когда я это делаю, он интерпретирует только первую заданную строку заголовков столбцов как столбцы. Все, что приведено ниже, включая другие столбцы и имена столбцов, являются строками, принадлежащими этим столбцам. Таким образом, в случае с рисунком выше, только columns1: 17 включены в качестве заголовков столбцов.

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

Спасибо!

Комментарии:

1. Есть ли у вас какой-либо контроль над другим кодом R? Подход, основанный на print() выводе и записи этого вывода в файл, даст вам что-то другое, основанное на ширине консоли при каждом запуске другого скрипта. было бы лучше иметь возможность использовать write.csv или другую функцию, предназначенную для записи данных в файл в другом скрипте, что упростило бы чтение данных в этом скрипте.

2. Я не могу ничего попробовать с этим без образцов данных, и я не собираюсь пытаться преобразовать это во что-то полезное. Пожалуйста, не включайте изображения данных / кода / ошибок, когда (две верхние строки) необработанного файла должны быть так же легко включены в блок кода в вашем вопросе.

3. @r2evans извините за это! Я думал, что блок кода предназначен только для сценариев кода, но теперь, когда я читаю об этом, я вижу, что я не знал об этом и о том, как это считается довольно плохой формой, lol. Спасибо за обратную связь и дайте мне знать. 🙂

4. «Блок кода» отлично подходит для всего, что выгодно использовать шрифты фиксированной ширины, данные — один из таких примеров.

5. @CalumYou Спасибо за помощь! Изначально я не был уверен в write.csv, потому что мне нужно выводить 1000 таких таблиц одновременно, для чего я использовал сценарий print и bash, и я не был уверен, смогу ли я сделать это с помощью write.csv, но я рассмотрю это подробнее, потому что это звучит такрешило бы мои проблемы!

Ответ №1:

Я буду использовать данные, которые были временно доступны в вашем вопросе:

 txt <- "column1      column122   column3   column4   column5   column6 
 27013443     10.33132 6.622399e-10 2701000   10.33132 6.622399e-10 
column12     column123   column44  column55    column67   column18
 10.33132  6.622399e-10      0       2.3        0            1.1  "

spl <- strsplit(txt, "[nr] ")[[1]]
ind1 <- seq(1, length(spl), by = 2)
ind2 <- seq(2, length(spl), by = 2)
out <- read.table(header = TRUE, text = c(
  paste(spl[ind1], collapse = " "),
  paste(spl[ind2], collapse = " ")
))
out
#    column1 column122      column3 column4  column5      column6 column12    column123 column44 column55 column67 column18
# 1 27013443  10.33132 6.622399e-10 2701000 10.33132 6.622399e-10 10.33132 6.622399e-10        0      2.3        0      1.1
  

Если у вас возникли проблемы с количеством пробелов между каждым столбцом, вы можете превентивно уменьшить эти пробелы, преобразовав их в CSV:

 txt2 <- gsub("[[:space:]] ", ",", txt)
spl2 <- strsplit(txt2, "[nr] ")[[1]]
ind1 <- seq(1, length(spl), by = 2)
ind2 <- seq(2, length(spl), by = 2)
out2 <- read.csv(text = c(
  paste(spl2[ind1], collapse = " "),
  paste(spl2[ind2], collapse = " ")
))
out
#    column1 column122      column3 column4  column5      column6 column12    column123 column44 column55 column67 column18
# 1 27013443  10.33132 6.622399e-10 2701000 10.33132 6.622399e-10 10.33132 6.622399e-10        0      2.3        0      1.1
  

Комментарии:

1. пользователь13097399, это решает вашу проблему? Если нет, возможно, вы можете заполнить, где я чего-то не хватает.

2. @r2evans- извините за поздний ответ — большое вам спасибо за вашу помощь! Я попробую это прямо сейчас и дам вам знать 🙂