经过大量的实验和谷歌搜索......以及随后的实验再次尝试,我终于在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的解决方案吗?
提前致谢。
答案 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
请注意,我按照您在问题中描述的方式实现了该功能,但这意味着总会丢失一行。我怀疑这不是你想要的。