我完全失去了。
我有五个数据框,每个数据框有五行,让我们说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中找到一种方法。
有人可以帮忙吗?谢谢!
答案 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行),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))