在数据帧的不同定义之间随机交换数据帧值

解释起来有点复杂,所以我希望它很清楚,但是如果没有的话,我会尝试进一步扩展。

所以我有一个像这样的数据框:

df <- data.frame(index=sort(runif(300,-10,10)),v1=runif(300,-2,-1),v2=runif(300,1,2))

它为我们提供了3列300行df。第一列(“索引”)包含从-10到10的排序值,后两列(“ v1” /“ v2”)包含对这个问题不重要的随机数值。

现在,我根据索引列将df行分类为十分位(例如,十分位1:放置1-30,十分位2:放置31-60),并且我想在各行之间随机交换,以使所有第1个十分位值与第六个十分位随机交换,所有第二个十分位值与第七个十分位随机交换,依此类推。当我说交换时,我的意思是索引值保留在原位置,但v1和v2值与相应行中的随机行的v1和v2交换(仍然耦合)。

例如,df中第一行的v1和v2(因此从第1个十分位开始)将与df中第160行的v1和v2(第6个十分位)交换,v1和v2 df(第1个十分位)中第二行的v1和v2将与df(也是第6个十分位数)中的第175行的v1和v2交换,df(第2个十分位数)的第31行的v1和v2将被交换df(第7个十分位数)中第186行的v1和v2等,因此所有v1 + v2值都随机更改为相应的新十进制。

希望很清楚。我已经尝试解决了几个小时,无法解决。

谢谢

shimin_3333 回答:在数据帧的不同定义之间随机交换数据帧值

使用class CodeController { public function actionGo() { $cardsIdsFromUsers = Users::find() ->select('card_id') ->column(); $accountsFromCards = Cards::find() ->where(['id' => $cardsIdsFromUsers]) ->all(); foreach($accountsFromCards as $account){ $user = Users::find() ->where(['card_id' => $account->id]) ->one(); $user->account_id = $account->account_id; $user->update(); } } } 按两个索引进行排序,一个是重新排列的十分位,另一个是随机的。

order()
,

我认为这就是您所需要的。

swapByBlocks <- function(df,blockSize = 30,nblocks = 10){
    if((nrow(df) != blockSize*nblocks) || nblocks %%2) stop("Undefined behaviour")
    swappedDF <- df[c((nrow(df)/2 +1):nrow(df),1:(nrow(df)/2)),]
    ndxMat <- sapply(1:(nblocks/2),function(dummy) sample(1:blockSize))
    for(i in 1:ncol(ndxMat)) {
        swappedDF[(i-1)*blockSize + 1:blockSize,] <- swappedDF[((i-1)*blockSize + 1:blockSize)[ndxMat[,i]],]
        swappedDF[(i+nblocks/2-1)*blockSize + 1:blockSize,] <- swappedDF[((i+nblocks/2-1)*blockSize + 1:blockSize)[order(ndxMat[,i])],]
    }   
    return(swappedDF)                
}

一个小的情况下,您可以检查其工作方式:

res <- swapByBlocks(df[1:18,],blockSize = 3,nblocks = 6)
> df[1:18,]
       index        v1       v2
1  -9.859624 -1.657779 1.954094
2  -9.774898 -1.015825 1.006341
3  -9.624402 -1.713754 1.527065
4  -9.441129 -1.891834 1.803793
5  -9.424195 -1.125674 1.581199
6  -8.890537 -1.142044 1.219111
7  -8.838012 -1.173445 1.013408
8  -8.296938 -1.780396 1.570550
9  -8.172076 -1.789056 1.178596
10 -7.671897 -1.988539 1.690468
11 -7.655868 -1.095662 1.876414
12 -7.450011 -1.337443 1.632104
13 -7.204528 -1.880350 1.408944
14 -7.085862 -1.232293 1.593247
15 -7.030691 -1.087031 1.924306
16 -6.989892 -1.639967 1.495058
17 -6.978945 -1.395340 1.872944
18 -6.930379 -1.841031 1.061046
> res
       index        v1       v2
10 -7.450011 -1.337443 1.632104
11 -7.655868 -1.095662 1.876414
12 -7.671897 -1.988539 1.690468
13 -7.030691 -1.087031 1.924306
14 -7.085862 -1.232293 1.593247
15 -7.204528 -1.880350 1.408944
16 -6.989892 -1.639967 1.495058
17 -6.930379 -1.841031 1.061046
18 -6.978945 -1.395340 1.872944
1  -9.624402 -1.713754 1.527065
2  -9.774898 -1.015825 1.006341
3  -9.859624 -1.657779 1.954094
4  -8.890537 -1.142044 1.219111
5  -9.424195 -1.125674 1.581199
6  -9.441129 -1.891834 1.803793
7  -8.838012 -1.173445 1.013408
8  -8.172076 -1.789056 1.178596
9  -8.296938 -1.780396 1.570550
> 

这里有18行,每行六个,每个数字三个。第1至3行与第10至12行,第4至6行,第13至15行以及第4行交换 7至9,第16至17行。

本文链接:https://www.f2er.com/3157680.html

大家都在问