首页 文章

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

提问于
浏览
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)))
}

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

提前致谢 .

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
    

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

相关问题