在R中的数据帧中将每两列重新采样

时间:2017-05-26 03:08:56

标签: r dataframe random

我有一个非常大的数据框,包含100行和400000列。

要对每列进行采样,我可以这样做:

df <- apply(df, 2, sample)

但我希望每两列都能一起采样。例如,如果最初col1为c(1,2,3,4,5)且col2也为c(6,7,8,9,10),并且在重新采样后,col1变为c(1,3,2,4,5),我希望col2为c(6,8,7,9,10),其遵循重新采样模式COL1。 col3&amp; col4,col5&amp; col6等。

我写了一个for循环来做这个,这需要永远。有没有更好的办法?谢谢!

1 个答案:

答案 0 :(得分:1)

你可以试试这个;使用split.default每两列拆分数据帧,对于每个子数据帧,对行进行采样,然后将它们绑定在一起:

df <- data.frame(col1 = 1:5, col2 = 6:10, col3 = 11:15)

index <- seq_len(nrow(df))
cbind.data.frame(
    setNames(lapply(
        split.default(df, (seq_along(df) - 1) %/% 2), 
        function(sdf) sdf[sample(index),,drop=F]), 
    NULL)
)

#  col1 col2 col3
#5    5   10   12
#4    4    9   11
#1    1    6   15
#2    2    7   14
#3    3    8   13