2

多くの実験とグーグルを行った後...そしてその後の実験の後、私はついにStackOverflowで最初の質問をすることになりました:)

data.frameがあり、data.frameの各行にカスタム関数を適用したいと思いますexpandBasesexpandBases1つ以上の行で構成されるdata.frameを返します(これは、提供されたデータによって異なります)。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)を使用するように言われました。これに対するプライヤーベースのソリューションがあるかどうか疑問に思いましたか?

前もって感謝します。

4

1 に答える 1

3

私はあなたが望むものを正確に少し推測する必要がありますが、ここではベース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

質問で説明したように関数を実装しましたが、それは常に1つの行が欠落することを意味することに注意してください。それはあなたが望んでいたことではないのではないかと思います。

于 2012-08-10T07:08:49.670 に答える