R重复数据帧的元素

时间:2012-01-04 12:35:47

标签: r dataframe repeat

我搜索了互联网,但我找不到解决问题的方法。 我有一个数字和字符的数据框:

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的类分别保存为数字,数字和字符,如我所愿。这是一个构造的示例,在我的数据框中设置每列的类有点乏味。

有没有办法在保存课程的同时进行重复?

6 个答案:

答案 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包中的disaggregateraster。或者,使用下面的修改后的版本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