【问题标题】:R : data frame Randomize columns by rowR:数据框按行随机列
【发布时间】:2011-12-23 20:30:07
【问题描述】:

我在 R 中有一个要随机化的数据框,保持第一列不变,但将最后两列随机化在一起,以便在这些列中出现在同一行中的值在之后都出现在同一行中随机化。所以如果我从这个开始:

1 a b c 
2 d e f 
3 g h i 

当随机化时,它可能看起来像:

1 a e f 
2 d h i 
3 g b c 

我知道该示例可以正常工作,但它是否保留了列等效性?

【问题讨论】:

  • 欢迎来到 SO!请尝试通过在将来添加可重复的示例来增强您的问题。例如,您可以使用 dput(yourdataframe) 并粘贴结果。
  • 我相当戏剧性地编辑了你的问题,因为在它以前的形式中,它基本上与你实际上提出的问题没有关系,因为你的 cmets 在下面。如果你觉得我手头太重,请随意回滚。

标签: r


【解决方案1】:
> t <- data.frame(matrix(nrow=4,ncol=10,data=1:40))
> t
    X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
    1  1  5  9 13 17 21 25 29 33  37
    2  2  6 10 14 18 22 26 30 34  38
    3  3  7 11 15 19 23 27 31 35  39
    4  4  8 12 16 20 24 28 32 36  40
> columns_to_random <- c(8,9,10)
> t[,columns_to_random] <- t[sample(1:nrow(t),size=nrow(t)), columns_to_random]
>   X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
    1  1  5  9 13 17 21 25 32 36  40
    2  2  6 10 14 18 22 26 29 33  37
    3  3  7 11 15 19 23 27 30 34  38
    4  4  8 12 16 20 24 28 31 35  39

【讨论】:

  • 谢谢 Max,太好了,这就是我正在寻找的解决方案,非常感谢
【解决方案2】:

一次只对一列进行采样就可以了。例如:

data[,2] = sample(data[,2])
data[,3] = sample(data[,3])
...

如果你有很多列,你可以这样扩展:

data[,-1] = apply(data[,-1], 2, sample)

编辑:随着您对行等效性的澄清,这只是:

data[,-1] = data[sample(nrow(data)),-1]

【讨论】:

  • 谢谢约翰,请看我对安德烈的评论
【解决方案3】:

您所说的“价值观等价”是什么意思? 老实说,我没有得到消息,但这是我的猜测。正如您所说,您可以使用示例,但在列上单独使用它,例如通过申请:

 # create a reproducible example
 test <- data.frame(indx=c(1,2,3),col1=c("a","d","g"),
               col2=c("b","e","h"),col3=c("c","f","i"))

 xyz <- apply(test[,-1],MARGIN=2,sample)
 as.data.frame(xyz)

【讨论】:

  • OP 评论了 Andrie 的(已删除?)帖子,说他只是想重新采样 。请参阅上面的我的编辑。
  • 哈哈。 thx John,您的意思是就像在我的示例中将 MARGIN 更改为 1 一样?
  • 哈哈是的。 :) 然后将其绑定到未修改的第 1 列旁边。
【解决方案4】:

在 plyr 中使用 colwise 进行优雅的列排列​​的方法:

test <- data.frame(matrix(nrow=4,ncol=10,data=1:40))

加载plyr

require(plyr)

创建一个按列的“样本”函数

colwise.sample <- colwise(sample)

应用于所需的行

permutation.test <- test
permutation.test[,c(1,3,4)] <- colwise.sample(test[,c(1,3,4)])

【讨论】:

    猜你喜欢
    • 2017-09-13
    • 2011-09-19
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多