Установка ширины столбца в наборе данных

Я хотел бы установить ширину столбцов (для всех трех столбцов) в этом наборе данных, как: anim=1-10; сиреид=11-20; дамид=21-30. В некоторых столбцах отсутствуют значения.

anim=c("1A038","1C467","2F179","38138","030081")
sireid=c("NA","NA","1W960","1W960","64404")
damid=c("NA","NA","1P119","1P119","63666")

mydf=data.frame(anim,sireid,damid)

person baz    schedule 21.10.2011    source источник
comment
Честно говоря, я действительно не знаю, что вы имеете в виду под шириной столбца. Не могли бы вы объяснить это более подробно?   -  person joran    schedule 21.10.2011
comment
@joran: пример: я хотел бы установить ширину или длину для первого столбца (анимация) как 1-6. я устанавливаю длину a в соответствии с возможным максимальным количеством символов. например, последний идентификатор анимации 030081 имеет 6 символов. Я хочу сделать то же самое с двумя столбцами. Благодарность!   -  person baz    schedule 21.10.2011
comment
Похоже, Хонг прав; Я никогда не использовал SAS, поэтому мне никогда не приходило в голову, что кто-то захочет сделать это в R.   -  person joran    schedule 21.10.2011
comment
@joran: это не просто функция R, хотя R может использовать это. Как я уже упоминал ниже, ответ Хонга - файл с фиксированной шириной полезен для целей отображения памяти: вы будете точно знать, где искать данные, поскольку макет поддается очень простой функции отображения. В результате не нужно индексировать каждую строку или анализировать каждую строку, чтобы получить произвольный доступ к данным. Файлы с отображением памяти не обязательно должны быть двоичными, как в случае с bigmemory. Возможность знать, где искать, означает, что данные могут быть МАССИВНЫМИ (хотя формат ASCII — непослушная трата).   -  person Iterator    schedule 31.10.2011


Ответы (3)


Прочитав ваш вопрос, а также ваши комментарии к предыдущим ответам, мне кажется, что вы пытаетесь создать файл фиксированной ширины со своими данными. В этом случае вы можете использовать функцию write.fwf в пакете gdata:

Загрузите пакет и создайте временный выходной файл:

library(gdata)
ff <- tempfile()

Запишите свои данные в формате фиксированной ширины во временный файл:

write.fwf(mydf, file=ff, width=c(10,10,10), colnames=FALSE)

Прочитайте файл с scan и распечатайте результаты (чтобы продемонстрировать вывод фиксированной ширины):

zz <- scan(ff, what="character", sep="\n")
cat(zz, sep="\n")

1A038      NA         NA        
1C467      NA         NA        
2F179      1W960      1P119     
38138      1W960      1P119     
030081     64404      63666    

Удалите временный файл:

unlink(ff)
person Andrie    schedule 31.10.2011
comment
Также приходилось обрабатывать данные fw в R. Обратите внимание, что есть еще `read.fwf - person Matt Bannert; 31.10.2011
comment
@ran2 Совершенно верно. Есть функция read.fwf. Я не хотел использовать это в своем примере, потому что хотел проиллюстрировать, что каждая строка представляет собой строку из одного символа (read.fwf проанализировал бы значения.) - person Andrie; 31.10.2011
comment
Эй, без обид - я не хотел улучшать ваш пример, только чтобы добавить этот комментарий для полноты картины;) Тем более, что он из другого пакета (утилиты) IIRC. - person Matt Bannert; 31.10.2011
comment
@Andrie: я пытаюсь получить новый фрейм данных (с заданной шириной столбцов) и записать его как новый файл. Как я могу это сделать? ...Прошу прощения за этот вопрос. - person baz; 03.11.2011
comment
Это то, что write.fwf делает для вас — записывает ваши данные в файл. - person Andrie; 03.11.2011
comment
Просто захожу, чтобы предупредить, что write.fwf будет жаловаться на узкие столбцы, а не на усечение представления числовых данных. Альтернативой является использование sprintf с последующим write . - person Carl Witthoft; 07.05.2014

Вы также можете записать вывод фиксированной ширины для чисел и строк, используя функцию sprintf(), которая является производной от аналога C.

Например, чтобы дополнить целые числа нулями:

sprintf("%012d",99)

Для заполнения пробелами: sprintf("%12d",123)

И для заполнения строк:

sprintf("%20s","hello world")

Параметры форматирования можно найти через ?sprintf, и есть много руководств по форматированию вывода C для фиксированной ширины.

person Iterator    schedule 31.10.2011

Похоже, вы пришли из SAS, где символьные переменные должны иметь явную длину, указанную во избежание неожиданного усечения. В R вам не нужно беспокоиться об этом. Строка символов содержит ровно столько символов, сколько ей нужно, и автоматически расширяется и сжимается по мере изменения ее содержимого.

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

person Hong Ooi    schedule 21.10.2011
comment
я использую R для установки этих данных, которые я собираюсь запустить в другой программе. Благодарность! - person baz; 21.10.2011
comment
Ах, в таком случае вам лучше экспортировать его как файл с разделителями-запятыми (csv), а не с полями фиксированной ширины. Хотя можно экспортировать с фиксированной шириной, это, вероятно, больше проблем, чем пользы. Большинство программ будут читать файлы csv напрямую. - person Hong Ooi; 21.10.2011
comment
Обычно это правильно, однако файл с фиксированной шириной полезен для целей сопоставления памяти: вы будете знать точно, где искать данные, поскольку макет поддается очень простой функции сопоставления. В результате не нужно индексировать каждую строку или анализировать каждую строку, чтобы получить произвольный доступ к данным. - person Iterator; 31.10.2011