使用R一次创建一个包含随机行块的数据帧

时间:2014-09-08 18:55:12

标签: r dataframe

我完全失去了。

我有五个数据框,每个数据框有五行,让我们说df1, df2, ..., df5。这些数据框是固定的 - 不需要在它们内部进行任何随机化。

我现在想要创建一个包含500行的数据帧,这是通过随机附加五个数据帧中的每一个100次构建的,每个数据帧具有相同的概率。也就是说,每个数据帧的五行以随机顺序附加 en bloc

因此,例如,一次迭代可能如下所示:

ROW  df
1     df1[1,]
2     df1[2,]
3     df1[3,]
4     df1[4,]
5     df1[5,]
6     df5[1,]
7     df5[2,]
8     df5[3,]
9     df5[4,]
10    df5[5,]
...
496   df2[1,]
497   df2[2,]
498   df2[3,]
499   df2[4,]
500   df2[5,]

在其他语言中,我可以绘制一个随机数并使用某种case术语,但我似乎无法在R中找到一种方法。

有人可以帮忙吗?谢谢!

3 个答案:

答案 0 :(得分:1)

不确定我是否理解正确。你可以尝试:

library(data.table)
df_list <- mget(ls(pattern="df\\d+"))  #using the data from @charles though without a set.seed()
res <- rbindlist(df_list[sample(seq_along(df_list),100, replace=TRUE)])

  res[1:10,]
 #        value
 #1: -0.81396114
 #2:  1.34798534
 #3:  0.08308022
 #4: -0.18476069
 #5:  0.58039641
 #6: -1.18188902
 #7: -0.74525519
 #8:  0.17258696
 #9: -1.20630019
#10:  1.42088692

  df_list[4:5]
 #$df4
 #      value
 #1 -1.1818890
 #2 -0.7452552
 #3  0.1725870
 #4 -1.2063002
 #5  1.4208869

 #$df5
 #       value
 #1 -0.81396114
 #2  1.34798534
 #3  0.08308022
 #4 -0.18476069
 #5  0.58039641

答案 1 :(得分:0)

假设我正确理解你的问题,你可以做这样的事情。

#we randomly sample the rows of each dataframe 100 times
rowSelection1<-sample(1:5, 100, replace=TRUE)
rowSelection2<-sample(1:5, 100, replace=TRUE)
rowSelection3<-sample(1:5, 100, replace=TRUE)
rowSelection4<-sample(1:5, 100, replace=TRUE)
rowSelection5<-sample(1:5, 100, replace=TRUE)


newDF<-rbind(df1[rowSelection1,], df2[rowSelection2,], df3[rowSelection3,], df4[rowSelection4,], df5[rowSelection5,]

我相信你可以概括一下,但这只是一个快速回答

这不是从dfs中随机抽样的,所以你可以这样做

 createNewRows<-function(dfid){
     switch(dfid, 
            "1"=df1,
            "2"=df2,
            "3"=df3,
            "4"=df4,
            "5"=df5,)
 }

 rowList<-lapply(sample(1:5, 100, replace=TRUE), createNewRows)

 rbindlist(rowList)

答案 2 :(得分:0)

如果我理解正确,以下可以做你想做的事:

df1 <- data.frame(value = rnorm(5), group = "A")
df2 <- data.frame(value = rnorm(5), group = "B")
df3 <- data.frame(value = rnorm(5), group = "C")
df4 <- data.frame(value = rnorm(5), group = "D")
df5 <- data.frame(value = rnorm(5), group = "E")

df_list <- list(df1, df2, df3, df4, df5)
require(data.table)
df <- rbindlist(rep(rbind(sample(df_list, 5)), 20))

sample随机选择下一个数据帧迭代的顺序,rbindlist是data.table包中的快速rbind函数,rep允许您选择迭代次数(20 * 25 = 500行),unlistas.data.frame可以获得您描述的输出。

如果您还想要在df中置换您的行,您只需添加一个lapply函数即可。虽然它可能不是最漂亮的但我相信如果你把它分成不同的元素就相对简单了:

df <- rbindlist(rep(rbind(sample(lapply(df_list, FUN = function(x) as.data.frame(x[sample(1:5),])), 5)), 20))