首页 > 解决方案 > 重新洗牌数据框

问题描述

我有这个数据框:

df <- structure(list(V1 = c(-0.513377392648462, -0.115417802464564, 
-0.59221826625517, 0.859214990738033), V2 = c(0.603691838479934, 
-0.268842631607886, -0.94656223839525, 1.15194045196878), V3 = c(-1.55412819921757, 
0.0226775961269093, -3.25263531205651, -0.559315716706791), V4 = c(-1.76538091299813, 
0.437926919105851, -2.618408442056, -4.15370525812295), V5 = c(-0.85670031683687, 
1.77767261051884, -0.679265604467705, -0.0408804962482887), V6 = c(0.800910644271573, 
-1.74178692619842, -2.178071352636, -0.581267717991917)), class = "data.frame", row.names = c(NA, 
-4L))

我想创建一个函数,返回没有替换n的排列df,然后将每个排列存储在不同的数据帧中。我知道sample()但我不确定如何存储排列。我尝试过类似的东西:

reshuffle <- function(a, b) {
  replicate(n = b, sample(as.matrix(a), replace = FALSE))
  }

但我明白了

> reshuffle(df, 3)
            [,1]       [,2]       [,3]
 [1,] -2.6184084  0.8592150 -0.6792656
 [2,] -0.5133774 -0.5922183  0.6036918
 [3,] -3.2526353 -2.1780714 -2.6184084
 [4,]  0.6036918 -1.7417869 -1.7653809
 [5,] -1.5541282  0.8009106  1.1519405
 [6,] -1.7417869 -3.2526353 -3.2526353
 [7,] -0.1154178 -0.2688426 -0.5812677
 [8,] -0.9465622 -1.5541282 -0.1154178
 [9,] -0.0408805 -0.0408805 -1.5541282
[10,] -4.1537053 -0.6792656 -0.8567003
[11,]  0.8592150 -0.5593157 -2.1780714
[12,]  1.7776726 -2.6184084 -4.1537053
[13,] -0.5922183  0.6036918  0.8009106
[14,] -0.5593157 -1.7653809 -0.5922183
[15,] -0.5812677 -0.1154178 -0.5593157
[16,]  1.1519405 -0.5133774  0.0226776
[17,]  0.0226776 -0.8567003 -1.7417869
[18,] -2.1780714  1.1519405 -0.0408805
[19,] -0.6792656 -0.9465622  0.8592150
[20,]  0.4379269 -4.1537053 -0.9465622
[21,] -0.2688426 -0.5812677  1.7776726
[22,] -0.8567003  0.0226776 -0.5133774
[23,] -1.7653809  1.7776726 -0.2688426
[24,]  0.8009106  0.4379269  0.4379269

标签: rfunctionfor-loop

解决方案


您可以创建一个与aarray相同的dim=ensions并强制它。选项确保结果是一个列表。as.data.framesimplify=FALSE

reshuffle <- function(a, b) replicate(b, as.data.frame(array(sample(as.matrix(a)), 
                                                             dim=dim(a))),
                                      simplify=FALSE)
set.seed(42)
reshuffle(df, 3)
# [[1]]
#           V1         V2         V3         V4         V5         V6
# 1 -0.8567003  0.8592150  1.1519405 -2.1780714 -0.6792656 -4.1537053
# 2  0.6036918  1.7776726 -0.9465622  0.4379269 -0.5922183 -0.5593157
# 3 -0.5133774 -0.5812677 -0.0408805  0.8009106 -1.7417869 -3.2526353
# 4  0.0226776 -2.6184084 -1.5541282 -0.1154178 -0.2688426 -1.7653809
# 
# [[2]]
#           V1         V2         V3         V4         V5         V6
# 1  0.6036918 -0.5922183 -2.6184084  0.8592150 -0.5812677 -1.5541282
# 2 -0.0408805 -0.5133774 -0.2688426 -0.5593157 -0.8567003  0.4379269
# 3 -0.1154178  0.0226776  1.7776726 -4.1537053 -1.7653809 -0.6792656
# 4  1.1519405 -3.2526353  0.8009106 -1.7417869 -0.9465622 -2.1780714
# 
# [[3]]
#           V1         V2         V3         V4         V5         V6
# 1 -2.1780714 -0.2688426 -0.6792656 -4.1537053 -2.6184084 -0.5593157
# 2 -0.8567003 -0.0408805  0.6036918  0.0226776 -0.5133774  0.4379269
# 3  0.8009106 -0.1154178 -1.7417869 -3.2526353 -1.7653809 -1.5541282
# 4  1.7776726 -0.5922183 -0.9465622  1.1519405  0.8592150 -0.5812677

所以你很接近,诀窍就是创建一个相同尺寸的数据框,并且simplify=FALSE


推荐阅读