[英]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行), unlist
和as.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.