在每一行上运行函数,返回多行R.

时间:2012-08-10 05:45:29

标签: r plyr

经过大量的实验和谷歌搜索......以及随后的实验再次尝试,我终于在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)))
}

我希望为返回的data.frame的每一行复制id因子。我被告知要使用lapply + do.call(rbind)。我想知道是否有基于plyr的解决方案吗?

提前致谢。

1 个答案:

答案 0 :(得分: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

请注意,我按照您在问题中描述的方式实现了该功能,但这意味着总会丢失一行。我怀疑这不是你想要的。