2

经过大量的实验和谷歌搜索......以及随后的再次实验,我终于在 StackOverflow 上提出了我的第一个问题:)

我有一个 data.frame,并希望将自定义函数 应用expandBases到 data.frame 的每一行。expandBases返回一个由 1 行或多行组成的 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)。我想知道是否有基于 plyr 的解决方案?

提前致谢。

4

1 回答 1

3

我必须稍微猜测一下你想要什么,但这里是如何使用 base 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

请注意,我实现了您在问题中描述的功能,但这意味着总是缺少一行。我怀疑这不是你想要的。

于 2012-08-10T07:08:49.670 回答