#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- извините за поздний ответ — большое вам спасибо за вашу помощь! Я попробую это прямо сейчас и дам вам знать 🙂