функция запуска в каждой строке, которая возвращает несколько строк R

После долгих экспериментов и поиска в Google ... и повторных экспериментов, я наконец-то задаю свой первый вопрос о StackOverflow :)

У меня есть data.frame, и я хочу применить пользовательскую функцию expandBases к каждой строке data.frame. expandBases возвращает data.frame, состоящий из 1 или более строк (и это будет зависеть от данных, предоставленных ему). expandBases на самом деле возвращает больше столбцов, чем в приведенном ниже игрушечном примере, но для иллюстрации:

structure(list(id = structure(1:3, .Label = c("a", "b", "c"), class = "factor"),
startpos = c(1, 2, 3), len = c(1, 2, 3)), .Names = c("id",
"startpos", "len"), row.names = c(NA, -3L), class = "data.frame")


expandBases <- function(startpos, len)
{
    return(data.frame(cy <- startpos + 0:(len - 1)))
}

Я бы хотел, чтобы коэффициент id реплицировался для каждой строки возвращаемого data.frame. Мне сказали использовать lapply + do.call (rbind). Мне было интересно, есть ли решение на основе plyr?

Заранее спасибо.


person Meep    schedule 10.08.2012    source источник
comment
Там есть. Я знаю свой ответ на предыдущий вопрос: stackoverflow.com/questions/11895796/ делает то же самое, и, возможно, @csgillespie тоже.   -  person IRTFM    schedule 10.08.2012


Ответы (1)


Я должен немного угадать, что именно вы хотите, но вот как использовать базу R (do.call + lapply), а также plyr:

Вспомогательная функция, создающая фрейм данных:

expandBases <- function(x){
  with(x, 
    data.frame(
      id = rep(id, len-1),
      cy = startpos + seq_len(len-1)
      )
   )
}

Используя базу R:

do.call(rbind, lapply(seq_len(nrow(dat)), function(i)expandBases(dat[i, ])))
  id cy
1  b  3
2  c  4
3  c  5

Использование plyr:

library(plyr)
adply(dat, 1, expandBases)[-(1:2)]
  id cy
1  b  3
2  c  4
3  c  5

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

person Andrie    schedule 10.08.2012
comment
Да, я просто понял, что мой пример был немного неправильным - и просто обновил его. В любом случае, ваше решение - то, что я хотел, и ему очень легко следовать. Спасибо за оба примера! - person Meep; 10.08.2012
comment
Также - я думаю, что id следует повторять "len" раз - поэтому одна из строк пропала? - person Meep; 10.08.2012
comment
@Lauren Да, я так считаю. len вместо len - 1 - person Andrie; 10.08.2012