【问题标题】:run function on each row which returns multiple rows R在返回多行 R 的每一行上运行函数
【发布时间】:2012-08-10 05:45:29
【问题描述】:

经过大量的实验和谷歌搜索......以及随后的再次实验,我终于在 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 的解决方案?

提前致谢。

【问题讨论】:

标签: r plyr


【解决方案1】:

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

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

【讨论】:

  • 是的,我刚刚意识到我的示例有点错误 - 并且刚刚更新了它。无论哪种方式,您的解决方案都是我想要的,并且很容易遵循。感谢您提供这两个示例!
  • 另外 -- 我认为 id 应该重复 'len' 次 -- 这就是其中一行丢失的原因吗?
  • @Lauren 是的,我相信是的。 len 而不是 len - 1
猜你喜欢
  • 2019-11-13
  • 2016-05-09
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多