我搜索了互联网,但我找不到解决问题的方法。 我有一个数字和字符的数据框:
mydf <- data.frame(col1=c(1, 2, 3, 4),
col2 = c(5, 6, 7, 8),
col3 = c("a", "b", "c", "d"), stringsAsFactors = FALSE)
是myDF:
col1 col2 col3
1 5 a
2 6 b
3 7 c
4 8 d
我想重复一遍
col1 col2 col3
1 5 a
1 5 a
1 5 a
2 6 b
2 6 b
2 6 b
3 7 c
3 7 c
3 7 c
4 8 d
4 8 d
4 8 d
使用apply(mydf, 2, function(x) rep(x, each = 3))
将给出正确的重复,但不会将col1,col2和col3的类分别保存为数字,数字和字符,如我所愿。这是一个构造的示例,在我的数据框中设置每列的类有点乏味。
有没有办法在保存课程的同时进行重复?
答案 0 :(得分:10)
这比你想象的还要容易。
index <- rep(seq_len(nrow(mydf)), each = 3)
mydf[index, ]
这也避免了apply
的隐式循环。
答案 1 :(得分:4)
这是一个不幸和意想不到的阶级转换(无论如何,我也是)。这是一个简单的解决方法,它使用data.frame只是一个特殊列表的事实。
data.frame(lapply(mydf, function(x) rep(x, each = 3)))
(任何人都知道为什么提问者观察到的行为不应该被报告为错误?)
答案 2 :(得分:2)
只是另一种解决方案:
mydf3 <- do.call(rbind, rep(list(mydf), 3))
答案 3 :(得分:1)
查看aggregate
包中的disaggregate
和raster
。或者,使用下面的修改后的版本zexpand
:
# zexpand: analogous to disaggregate
zexpand<-function(inarray, fact=2, interp=FALSE, ...) {
# do same analysis of fact to allow one or two values, fact >=1 required, etc.
fact<-as.integer(round(fact))
switch(as.character(length(fact)),
'1' = xfact<-yfact<-fact,
'2'= {xfact<-fact[1]; yfact<-fact[2]},
{xfact<-fact[1]; yfact<-fact[2];warning(' fact is too long. First two values used.')})
if (xfact < 1) { stop('fact[1] must be > 0') }
if (yfact < 1) { stop('fact[2] must be > 0') }
bigtmp <- matrix(rep(t(inarray), each=xfact), nrow(inarray), ncol(inarray)*xfact, byr=T) #does column expansion
bigx <- t(matrix(rep((bigtmp),each=yfact),ncol(bigtmp),nrow(bigtmp)*yfact,byr=T))
# the interpolation would go here. Or use interp.loess on output (won't
# handle complex data). Also, look at fields::Tps which probably does
# a much better job anyway. Just do separately on Re and Im data
return(invisible(bigx))
}
答案 4 :(得分:1)
我真的很喜欢Richie Cotton的回答。
但你也可以简单地使用rbind
并重新排序。
res <-rbind(mydf,mydf,mydf)
res[order(res[,1],res[,2],res[,3]),]
答案 5 :(得分:0)
包mefa
带有适用于rep
的{{1}}的精美包装。这将在一行中匹配您的示例:
data.frame