我正在尝试从数据框中复制每一列,并将其移至1-3列中的随机位置,然后对数据框中的每一列进行操作。我希望列至少向左或向右移动一个空格。当然sample(data)
会随机地对列进行重新排序,但是我试图将其放入一个循环中是非常尴尬的(我承认我跳过了大多数线性代数类,该死的...)。以下是示例数据:
dat <- read.table(textConnection(
"-515.5718 94.33423 939.6324 -502.9918 -75.14629 946.6926
-515.2283 96.10239 939.5687 -503.1425 -73.39015 946.6360
-515.0044 97.68119 939.4177 -503.4021 -71.79252 946.6909
-514.7430 99.59141 939.3976 -503.6645 -70.08514 946.6887
-514.4449 101.08511 939.2342 -503.9207 -68.48133 946.7183
-514.2769 102.29453 939.0013 -504.2665 -67.04509 946.7809
-513.9294 104.02753 938.9436 -504.4703 -65.34361 946.7899
-513.5900 105.49624 938.7684 -504.7405 -63.75965 946.7991"
),header=F,as.is=T)
sample(dat)#random columns position
最佳答案
这种强力但快速的解决方案怎么样?
它尝试对列进行不同的排列,直到找到一个列,其中每列至少移动1,并且向左或向右移动不超过3列。当发现这样的排列时,while()
调用的最后一行中的测试将得出FALSE
,终止循环并保留包含可接受排列的变量x
。
n <- ncol(dat)
while({x <- sample(n) # Proposed new column positions
y <- seq_len(n) # Original column positions
max(abs(x - y)) > 3 | min(abs(x - y)) == 0
}) NULL
dat[x]