Добавление нового столбца на основе заголовка столбца - PullRequest
3 голосов
/ 08 марта 2011

Я работаю с R, чтобы преобразовать несколько миллионов строк данных в одном столбце, как этот .....

fixedStep chrom=chr7 start=10239 step=1
0.064
0.064
0.064
0.055
0.055
0.089
0.076
fixedStep chrom=chr7 start=10262 step=1
0.076
0.076
0.089
0.076
0.076
0.076
0.076
0.089
0.089
0.076
0.089
0.076
0.089
0.089
fixedStep chrom=chr7 start=10398 step=1
0.076
0.089
0.089
0.089
0.089
0.076

в этот ......

10239 0.064
10240 0.064
10241 0.064
10242 0.055
10243 0.055
10244 0.089
10245 0.076
10262 0.076
10263 0.076
10264 0.089
10265 0.076
10266 0.076
10267 0.076
10268 0.076
10269 0.089
10270 0.089
10271 0.076
10272 0.089
10273 0.076
10274 0.089
10275 0.089
10398 0.076
10399 0.089
10400 0.089
10401 0.089
10402 0.089
10403 0.076

то есть я хочу добавить новый столбец чисел (либо до, либо после данных, в приведенном выше примере это до данных).Номера нового столбца начинаются с start=value и увеличиваются на 1 (step=1), пока не будет достигнут новый заголовок столбца (fixedStep chrom=chr7 start=10262 step=1).Когда это происходит, числа начинаются с start=new value и снова увеличиваются на 1 (step=1), до нового заголовка столбца ... и т. Д. И т. П.

Поскольку это большой файл, яне может загрузить его в рабочее пространство R.Было бы неплохо объединить его с инструментами UNIX / linux для выполнения этой операции.

Ответы [ 2 ]

4 голосов
/ 08 марта 2011

Поскольку вы сказали unix ...

#!/usr/bin/awk -f
/^fixedStep/ {
  i=int(substr($0,match($0,"start=")+6))
  d=int(substr($0,match($0,"step=")+5))
}
!/^f/ { print i, $0; i+=d }

Что он делает: в строках, начинающихся с «fixedStep», он находит позицию «start =», добавляет 6 (длина «start =»"), берет подстроку, начинающуюся с этой позиции, усекает ее до целочисленного значения и присваивает ей i (в awk целые числа и строки довольно взаимозаменяемы, и" 12345 step = 1 "отлично работает как целое число со значением 12345,но мы хотим напечатать только целую часть позже, поэтому имеет смысл урезать ее здесь).Аналогично для "step =".

В строках, не начинающихся с "f", он печатает i и строку и добавляет d к i.

2 голосов
/ 08 марта 2011

Вы можете использовать функцию readLines для сканирования файла один за другим. Таким образом, вам не нужно загружать все в память. Одна возможность - использовать следующую функцию.

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

ReadFile <- function(file){

  DF <- data.frame(ID=numeric(0),value=numeric(0))

   while(1){

    z <- readLines(file,1)
    if(length(z)==0 | z=="") {break}

    Start <- if(grepl("start",z))
      as.numeric(gsub(".+start=(\\d+).+","\\1",z))

    if(is.null(Start)){
        DF <- rbind(DF,
            data.frame(ID=ID,value=as.numeric(z))
        )
        ID <- ID + 1
    } else {
      ID <- Start
    }
  }
  return(DF)
}

Проверено на ваших данных:

ZZ <- textConnection("fixedStep chrom=chr7 start=10239 step=1
0.064
0.076
fixedStep chrom=chr7 start=10262 step=1
0.076
0.089
fixedStep chrom=chr7 start=10398 step=1
0.045
0.089
")

> ReadFile(ZZ)
     ID value
1 10239 0.064
2 10240 0.076
3 10262 0.076
4 10263 0.089
5 10398 0.045
6 10399 0.089
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...