如何随机化(或置换) Dataframe 的行和列?

vfwfrxfs  于 2023-02-01  发布在  其他
关注(0)|答案(9)|浏览(206)

我有一个 Dataframe (df1),如下所示。

f1   f2   f3   f4   f5
d1   1    0    1    1    1  
d2   1    0    0    1    0
d3   0    0    0    1    1
d4   0    1    0    0    1

d1...d4列是行名称,f1...f5行是列名称。
要执行sample(df1),我将得到一个新的 Dataframe ,其计数为1,与df1相同。因此,计数1将为整个 Dataframe 保留,而不是为每行或每列保留。
是否可以按行或按列进行随机化?
我想对每列的df1按列进行随机化,即每列中1的个数保持不变,并且每列至少需要改变一次。例如,我可能有一个随机化的df2,如下所示:(注意,每列中1的计数保持相同,但每行中1的计数不同。

f1   f2   f3   f4   f5
d1   1    0    0    0    1  
d2   0    1    0    1    1
d3   1    0    0    1    1
d4   0    0    1    1    0

同样,我也想对每一行的df1进行逐行随机化,也就是说,每一行中1的个数保持不变,每一行需要更改(但更改条目的个数可能不同)。例如,随机化的df3可能如下所示:

f1   f2   f3   f4   f5
d1   0    1    1    1    1  <- two entries are different
d2   0    0    1    0    1  <- four entries are different
d3   1    0    0    0    1  <- two entries are different
d4   0    0    1    0    1  <- two entries are different

PS.非常感谢Gavin Simpson,Joris Meys和Chase对我之前关于随机化两列的问题的帮助。

kzipqqlq

kzipqqlq1#

给定R Dataframe :

> df1
  a b c
1 1 1 0
2 1 0 0
3 0 1 0
4 0 0 0

按行随机播放:

> df2 <- df1[sample(nrow(df1)),]
> df2
  a b c
3 0 1 0
4 0 0 0
2 1 0 0
1 1 1 0

默认情况下,sample()随机重新排序作为第一个参数传递的元素。这意味着默认大小是传递的数组的大小。将参数replace=FALSE(默认值)传递给sample(...)可确保采样在没有替换的情况下完成,从而实现按行的混洗。

按列随机播放:

> df3 <- df1[,sample(ncol(df1))]
> df3
  c a b
1 0 1 1
2 0 1 0
3 0 0 1
4 0 0 0
9fkzdhlc

9fkzdhlc2#

这是使用dplyr包对data.frame进行混洗的另一种方法:
行方式:

df2 <- slice(df1, sample(1:n()))

df2 <- sample_frac(df1, 1L)

列方式:

df2 <- select(df1, one_of(sample(names(df1))))
7lrncoxx

7lrncoxx3#

看一下vegan包中的permatswap(),这里有一个同时维护行和列总和的例子,但是你可以放松这个限制,只修改行和列总和中的一个。

mat <- matrix(c(1,1,0,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,1,1), ncol = 5)
set.seed(4)
out <- permatswap(mat, times = 99, burnin = 20000, thin = 500, mtype = "prab")

这给出:

R> out$perm[[1]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    1    1    1
[2,]    0    1    0    1    0
[3,]    0    0    0    1    1
[4,]    1    0    0    0    1
R> out$perm[[2]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    0    1    1
[2,]    0    0    0    1    1
[3,]    1    0    0    1    0
[4,]    0    0    1    0    1

要解释呼叫:

out <- permatswap(mat, times = 99, burnin = 20000, thin = 500, mtype = "prab")
  1. times是所需的随机矩阵数,此处为99
  2. burnin是在我们开始随机抽样之前进行的交换次数,这使得我们抽样的矩阵在我们开始每个随机化矩阵之前是相当随机的
  3. thin表示仅在每次thin交换时进行随机抽奖
  4. mtype = "prab"表示将矩阵视为存在/不存在,即二进制0/1数据。
    需要注意的是,这并不能保证任何列或行都是随机的,但如果burnin足够长,那么这种情况很有可能发生。此外,您可以绘制比您需要的更多的随机矩阵,并丢弃不符合所有要求的矩阵。
    您要求每行有不同数量的更改,这里也没有涉及。同样,您可以抽样比您想要的更多的矩阵,然后丢弃不满足此要求的矩阵。
k2fxgqgv

k2fxgqgv4#

您还可以使用R包picante中的randomizeMatrix函数
示例:

test <- matrix(c(1,1,0,1,0,1,0,0,1,0,0,1,0,1,0,0),nrow=4,ncol=4)
> test
     [,1] [,2] [,3] [,4]
[1,]    1    0    1    0
[2,]    1    1    0    1
[3,]    0    0    0    0
[4,]    1    0    1    0

randomizeMatrix(test,null.model = "frequency",iterations = 1000)

     [,1] [,2] [,3] [,4]
[1,]    0    1    0    1
[2,]    1    0    0    0
[3,]    1    0    1    0
[4,]    1    0    1    0

randomizeMatrix(test,null.model = "richness",iterations = 1000)

     [,1] [,2] [,3] [,4]
[1,]    1    0    0    1
[2,]    1    1    0    1
[3,]    0    0    0    0
[4,]    1    0    1    0
>

选项null.model="frequency"维护列和,richness维护行和。虽然主要用于随机化群落生态学中的物种存在缺失数据集,但在这里也能很好地工作。
此函数还有其他空模型选项,请查看以下链接了解picante documentation的更多详细信息(第36页)

lx0bsm1f

lx0bsm1f5#

当然,您可以对每一行进行采样:

sapply (1:4, function (row) df1[row,]<<-sample(df1[row,]))

将自己对行进行混洗,因此每行中1的数量不会改变。小的变化也能很好地处理列,但这是读者的练习:-P

c2e8gylq

c2e8gylq6#

如果目标是随机地重排每一列,那么上面的一些答案不起作用,因为列是联合重排的(这保留了列间的相关性),其他答案需要安装一个包。

df2 = lapply(df1, function(x) { sample(x) })
pgccezyw

pgccezyw7#

您还可以使用类似下面的方法对数据框中相同数量的项目进行“采样”:

nr<-dim(M)[1]
random_M = M[sample.int(nr),]
wgmfuz8q

wgmfuz8q8#

Dataframe 中的随机样本和排列如果是矩阵形式,请转换为数据。帧使用基本包中的样本函数indexes = sample(1:nrow(df1),size=1*nrow(df1))随机样本和排列

djp7away

djp7away9#

下面是一个data.table选项,将.Nsample一起使用,如下所示:

library(data.table)
setDT(df)
df[sample(.N)]
#>    a b c
#> 1: 0 1 0
#> 2: 1 1 0
#> 3: 1 0 0
#> 4: 0 0 0

创建于2023年1月28日,使用reprex v2.0.2

    • 数据**:
df <- read.table(text = "  a b c
1 1 1 0
2 1 0 0
3 0 1 0
4 0 0 0", header = TRUE)

相关问题