繁体   English   中英

使用R一次创建具有随机行块的数据框

[英]Using R to create a dataframe with random blocks of rows at a time

我完全不知所措。

我有五个数据帧,每个数据帧中有五行,例如df1, df2, ..., df5 这些数据帧是固定的-无需在其中进行任何随机化。

现在,我想创建一个包含500行的数据框,该数据框是通过将五个数据框的每一个随机附加100次而构成的,每个框具有相等的概率。 也就是说,每个数据帧的五行以随机顺序附加到整块

因此,例如,一个迭代可能看起来像这样:

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中执行此操作的方法。

有人可以帮忙吗? 谢谢!

不知道我是否正确理解。 您可以尝试:

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

假设我正确理解了您的问题,您可以执行以下操作。

#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)

如果我对您的理解正确,则可以执行以下操作:

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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM