首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在数据帧的不同十进制之间随机交换数据帧值

在数据帧的不同十进制之间随机交换数据帧值
EN

Stack Overflow用户
提问于 2019-11-06 01:13:56
回答 2查看 48关注 0票数 0

这有点复杂,所以我希望它足够清楚,但如果不是,我会尝试并扩展更多。

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

代码语言:javascript
复制
df <- data.frame(index=sort(runif(300, -10,10)), v1=runif(300, -2,-1), v2=runif(300, 1,2))

它为我们提供了一个3列300行的df。第一列("index")包含从-10到10的排序值,接下来的两列("v1"/"v2")包含对此问题不重要的随机数值。

现在,我根据索引列将df行分类为decile (例如,decile 1: places 1-30,decile 2: places 31-60),并希望在行之间随机交换,以便所有第一个十进制值与第六个十进制值随机交换,所有第二个十进制值与第七个十进制值随机交换,依此类推。当我说交换时,我的意思是索引值保持不变,但是v1和v2值与适当十进制数中随机行的v1和v2交换(仍然是耦合的)。

例如,df中第一行的v1和v2 (因此从第一个十进制数开始)将与df (第六个十进制数)中第160行的v1和v2交换,df (第一个十进制数)中第二行的v1和v2将与df (也是第六个十进制数)中第175行的v1和v2交换,df (第二个十进制数)中第31行的v1和v2将与df (第七十进制数)中第186行的v1和v2交换,依此类推,因此所有v1+v2值都随机地改变到其适当的新十进制数。

希望一切都清楚了。我已经试着解了几个小时了,但还是想不出来。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2019-11-06 05:05:38

使用order()按两个索引排序,一个是重新排列的十进制,另一个是随机的。

代码语言:javascript
复制
set.seed(123)
dtf <- data.frame(round(cbind(index=sort(runif(20, -10, 10)), 
                                 v1=runif(20, 0, 5), 
                                 v2=runif(20, 5, 10)), 2))
ea <- nrow(dtf)/10

# Deciles shifted by 5
d <- rep(((1:10 + 4) %% 10) + 1, each=ea)

# Random index within decile
r <- c(replicate(10, sample(ea)))

cbind(dtf, z=dtf[order(d, r), -1])
#    index   v1   v2 z.v1 z.v2
# 12 -9.16 4.45 5.71 4.51 7.21
# 11 -9.09 3.46 7.07 4.82 5.23
# 14 -7.94 3.20 7.07 3.98 5.61
# 13 -5.08 4.97 6.84 3.45 8.99
# 15 -4.25 3.28 5.76 0.12 7.80
# 16 -3.44 3.54 5.69 2.39 6.03
# 17 -1.82 2.72 6.17 3.79 5.64
# 18 -0.93 2.97 7.33 1.08 8.77
# 19 -0.87 1.45 6.33 1.59 9.48
# 20  0.56 0.74 9.29 1.16 6.87
# 2   1.03 4.82 5.23 3.46 7.07
# 1   1.45 4.51 7.21 4.45 5.71
# 3   3.55 3.45 8.99 3.20 7.07
# 4   5.77 3.98 5.61 4.97 6.84
# 6   7.66 0.12 7.80 3.54 5.69
# 5   7.85 2.39 6.03 3.28 5.76
# 8   8.00 3.79 5.64 2.97 7.33
# 7   8.81 1.08 8.77 2.72 6.17
# 10  9.09 1.59 9.48 0.74 9.29
# 9   9.14 1.16 6.87 1.45 6.33
票数 1
EN

Stack Overflow用户

发布于 2019-11-06 04:58:26

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

代码语言:javascript
复制
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)                
}

一个小案例,您可以在其中检查它的工作方式:

代码语言:javascript
复制
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行,每行有6个块,每个块有三个数字。行1到3与行10到12交换,行4到6与行13到15交换,行4 7到9与行16到17交换。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58716319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档