在子数组之间移动行

2024-01-01

我有许多子数组,比如 2 个(为了简单起见),每个子数组具有相同的行数和列数。子数组中的每个位置都由 [1, 10] 中的数字占据。

我想做的是根据某种移动速率 m = [0, 1] 在子数组之间随机移动行。 m = 0 对应于不移动,而 m = 1 表示所有子数组中的任何行都可以移动。

我的灵感来自:

如何在R中的2行之间交换多个值 https://stackoverflow.com/questions/38805833/how-to-swap-a-number-of-the-values-between-2-rows-in-r

但我的问题与此有点不同。我确实知道这里需要sample()。

有没有一种简单的方法可以实现这一目标?

这并不能解决问题,但我相信无论如何我都走在正确的轨道上。

m <- 0.2

 a <- array(dim = c(5, 5, 2)) # 5 rows, 5 columns, 2 subarrays

res <- rep(sample(nrow(a), size = ceiling(nrow(a)*m), replace = FALSE)) # sample 20% of rows from array a. 

如有任何帮助,我们将不胜感激。


如果您可以使用matrix (2-dim array).

set.seed(2)
m <- 0.2
d <- c(10, 4)
a <- array(sample(prod(d)), dim = d)
a
#       [,1] [,2] [,3] [,4]
#  [1,]    8   17   14    1
#  [2,]   28   37   40   26
#  [3,]   22   38   16   29
#  [4,]    7   35    3   32
#  [5,]   34   11   23    4
#  [6,]   36   33   19   31
#  [7,]    5   24   30   13
#  [8,]   39    6   27   25
#  [9,]   15   10   12    9
# [10,]   18    2   21   20

(我将再次将种子设置为可以方便地向我展示一些“有趣”的东西。)

set.seed(2)
ind <- which(runif(d[1]) < m)
ind
# [1] 1 4 7

第一个随机性,runif, 与m并生成索引可能会改变。第二个随机性,sample下面,获取这些索引并可能对它们重新排序。 (在本例中,它将“1,4,7”重新排序为“4,1,7”,这意味着可能更改的第三行将保持不变。)

a[ind,] <- a[sample(ind),]
a
#       [,1] [,2] [,3] [,4]
#  [1,]    7   35    3   32  # <-- row 4
#  [2,]   28   37   40   26
#  [3,]   22   38   16   29
#  [4,]    8   17   14    1  # <-- row 1
#  [5,]   34   11   23    4
#  [6,]   36   33   19   31
#  [7,]    5   24   30   13  # <-- row 7, unchanged
#  [8,]   39    6   27   25
#  [9,]   15   10   12    9
# [10,]   18    2   21   20

请注意,这是概率性的,这意味着 0.2 的概率并不能保证你有 20%(甚至any) 的行将被交换。

(因为我猜你真的很想保留你的 3-dim (甚至n-dim) array,你也许可以使用aperm之间转移array <--> matrix.)

EDIT 1

作为概率使用的替代方案runif, 您可以使用:

ind <- head(sample(d[1]),size=d[1]*m) 

更接近你的目标“20%”。自从d[1]*m通常不是整数,head默默地截断/下限数字,因此您将获得价格合适的获胜者:最接近但不超过您想要的百分比。

EDIT 2

一种可逆变换方法n维数组转换为矩阵,然后再转换回来。Caveat:虽然逻辑看起来很可靠,但我的测试只包括几个数组。

array2matrix <- function(a) {
  d <- dim(a)
  ind <- seq_along(d)
  a2 <- aperm(a, c(ind[2], ind[-2]))
  dim(a2) <- c(d[2], prod(d[-2]))
  a2 <- t(a2)
  attr(a2, "origdim") <- d
  a2
}

反转使用的是"origdim"属性(如果仍然存在);只要您对矩阵的修改不清除其属性,这就会起作用。 (简单的行交换则不然。)

matrix2array <- function(m, d = attr(m, "origdim")) {
  ind <- seq_along(d)
  m2 <- t(m)
  dim(m2) <- c(d[2], d[-2])
  aperm(m2, c(ind[2], ind[-2]))
}

(这两个函数可能应该做更多的错误检查,例如is.null(d).)

示例运行:

set.seed(2)
dims <- 5:2
a <- array(sample(prod(dims)), dim=dims)

快速展示:

a[,,1,1:2,drop=FALSE]
# , , 1, 1
#      [,1] [,2] [,3] [,4]
# [1,]   23  109   61   90
# [2,]   84   15   27  102
# [3,]   68   95   83   24
# [4,]   20   53  117   46
# [5,]  110   62   43    8
# , , 1, 2
#      [,1] [,2] [,3] [,4]
# [1,]  118   25   14   93
# [2,]   65   21   16   77
# [3,]   87   82    3   38
# [4,]   92   12   78   17
# [5,]   49    4   75   80

转变:

m <- array2matrix(a)
dim(m)
# [1] 30  4
head(m)
#      [,1] [,2] [,3] [,4]
# [1,]   23  109   61   90
# [2,]   84   15   27  102
# [3,]   68   95   83   24
# [4,]   20   53  117   46
# [5,]  110   62   43    8
# [6,]   67   47    1   54

可逆性证明:

identical(matrix2array(m), a)
# [1] TRUE

编辑3,“所有代码的总结”

创建虚假数据:

dims <- c(5,4,2)
(a <- array(seq(prod(dims)), dim=dims))
# , , 1
#      [,1] [,2] [,3] [,4]
# [1,]    1    6   11   16
# [2,]    2    7   12   17
# [3,]    3    8   13   18
# [4,]    4    9   14   19
# [5,]    5   10   15   20
# , , 2
#      [,1] [,2] [,3] [,4]
# [1,]   21   26   31   36
# [2,]   22   27   32   37
# [3,]   23   28   33   38
# [4,]   24   29   34   39
# [5,]   25   30   35   40
(m <- array2matrix(a))
#       [,1] [,2] [,3] [,4]
#  [1,]    1    6   11   16
#  [2,]    2    7   12   17
#  [3,]    3    8   13   18
#  [4,]    4    9   14   19
#  [5,]    5   10   15   20
#  [6,]   21   26   31   36
#  [7,]   22   27   32   37
#  [8,]   23   28   33   38
#  [9,]   24   29   34   39
# [10,]   25   30   35   40
# attr(,"origdim")
# [1] 5 4 2

行的随机交换。我这里用的是50%。

pct <- 0.5
nr <- nrow(m)
set.seed(3)
(ind1 <- sample(nr, size = ceiling(nr * pct)))
# [1] 2 8 4 3 9
(ind2 <- sample(ind1))
# [1] 3 2 9 8 4
m[ind1,] <- m[ind2,]
m
#       [,1] [,2] [,3] [,4]
#  [1,]    1    6   11   16
#  [2,]    3    8   13   18
#  [3,]   23   28   33   38
#  [4,]   24   29   34   39
#  [5,]    5   10   15   20
#  [6,]   21   26   31   36
#  [7,]   22   27   32   37
#  [8,]    2    7   12   17
#  [9,]    4    9   14   19
# [10,]   25   30   35   40
# attr(,"origdim")
# [1] 5 4 2

(请注意,我预先制作了ind1 and ind2在这里,主要是为了看看内部发生了什么。您可以更换m[ind2,] with m[sample(ind1),]达到同样的效果。)

顺便说一句:如果我们使用种子 2,我们会注意到 2 行没有被交换:

set.seed(2)
(ind1 <- sample(nr, size = ceiling(nr * pct)))
# [1]  2  7  5 10  6
(ind2 <- sample(ind1))
# [1]  6  2  5 10  7

因此,我选择了3号种子进行演示。然而,这可能会使事情看起来不起作用。缺乏更多的控制代码,sample不确保位置发生变化:期望“随机交换行”可以随机选择将第 2 行移动到第 2 行当然是合理的。举个例子:

set.seed(267)
(ind1 <- sample(nr, size = ceiling(nr * pct)))
# [1] 3 6 5 7 2
(ind2 <- sample(ind1))
# [1] 3 6 5 7 2

第一个随机选择五行,然后将它们随机重新排序为不变的顺序。 (我建议如果你想force它们都是运动,你应该问一个新问题,询问只是强迫sample要改变的向量。)

无论如何,我们可以用第二个函数恢复原始维度:

(a2 <- matrix2array(m))
# , , 1
#      [,1] [,2] [,3] [,4]
# [1,]    1    6   11   16
# [2,]    3    8   13   18
# [3,]   23   28   33   38
# [4,]   24   29   34   39
# [5,]    5   10   15   20
# , , 2
#      [,1] [,2] [,3] [,4]
# [1,]   21   26   31   36
# [2,]   22   27   32   37
# [3,]    2    7   12   17
# [4,]    4    9   14   19
# [5,]   25   30   35   40

在数组的第一个平面中,第 1 行和第 5 行保持不变;在第二个平面中,第 1、2 和 5 行保持不变。五行相同,五行移动(但每行内其他方面不变)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在子数组之间移动行 的相关文章

  • 为“facet_wrap”中的每列创建边框和标题

    我想在每个方面周围放置带有标签和标题的黑色边框facet wrap 与此类似的东西 样本数据 library tidyverse mtcars gt mutate gear factor gear levels c 4 3 5 gt ggp
  • 使用 R:如何创建带有日期的时间序列对象?

    我有一年中每小时采集的一系列值 是否可以创建一个保留小时和年份值的时间序列对象 我的代码使用股票价格第一列中的值 但不使用日期 stockprices ts lt ts stockprices 1 start 1 freq 168 您没有提
  • 如何在R中使用OpenNLP获取POS标签?

    这是 R 代码 library NLP library openNLP tagPOS lt function x s lt as String x word token annotator lt Maxent Word Token Anno
  • Openxlsx 多次验证损坏输出文件

    我正在尝试添加多个验证并将公式添加到 Excel 文件 这是我使用的代码 library openxlsx fileTemplate lt New01 xlsx wbTemplate lt loadWorkbook fileTemplate
  • 如何管理和处理 R 包中的补充数据

    我想在我的 R 包中添加补充数据 我知道关于LazyData true in DESCRIPTION 但不想使用它 因为示例数据相当大 所以我创建了一个目录 data 其中包含两个 RData文件和一个datalist 我添加使用tools
  • 根据另一个向量替换向量中的值

    我想替换向量中的值 x 与另一个向量 y 陷阱 22 方法需要是动态的 以适应向量中不同数量的 级别 x 例如 考虑向量x x lt sample c 1 2 3 4 5 100 replace TRUE gt x 1 2 4 1 1 3
  • 如何加速 R for 循环?

    我正在为 R 中 GWmodel 包中的 gwr basic 函数运行以下 for 循环 我需要做的是收集任何给定带宽的估计参数的平均值 代码如下 library GWmodel data DubVoter Dub voter LARent
  • R:为什么 kable 不在 for 循环内打印?

    我正在使用 rmarkdown 和 Latex 编写报告 我需要使用打印一组表格knitr kable 但在 for 循环内时不会打印 这是我的代码 title project title author Mr Author date 201
  • 无重叠的抖动点

    My data a lt sample 1 5 100 replace TRUE b lt sample 1 5 100 replace TRUE c lt sample 1 10 100 replace TRUE d lt sample
  • 按列分组的数据帧上 R 中的行之间的差异

    我希望通过 app name 获得不同版本的计数差异 我的数据集如下所示 app name version id count difference 这是数据集 data structure list app name structure c
  • R 中的 as.numeric 有什么问题? [复制]

    这个问题在这里已经有答案了 gt X864291X8X74 1 8 0000000000 9 0000000000 10 0000000000 6 0000000000 8 0000000000 10 Levels 0 0000000000
  • R Data.Table 创建带有条件的变量

    我需要在下面的数据集中创建一个新变量 A X a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 The newvar如果X等于 2 5 7 或 9 否则 newvar应该是 0 Code dt1 lt dat
  • 循环中的knitr模板和子文档

    圣诞节前我之前问过跨多个 knitr 文档的单一样式表 https stackoverflow com questions 20370584 single style sheet across multiple knitr document
  • read.table 和 read.delim 函数之间的区别

    两者有什么区别read table and read delim R语言中的函数 当您不确定函数的作用时 除了阅读帮助页面之外 您还可以检查函数的实际代码 例如 输入read delim显示该函数包含以下代码 gt read delim f
  • 优化 R 中的嵌套 for 循环

    我尝试加速下面的代码 但没有成功 我读到Rfast https cran r project org web packages Rfast Rfast pdf包 但我也未能实现该包 有没有办法优化R中的以下代码 RI lt function
  • 建模前减少因子水平数量

    我有一个 2600 个级别的因子 我想在建模之前将其减少到 10 我想我可以通过这样的操作来做到这一点 如果一个因素列出的次数少于 x 次 则应将其放入名为 其他 的存储桶中 这是一些示例数据 df lt data frame colour
  • 栅格堆叠后如何写入?

    我想操作几个光栅文件 然后再次写入它们 rasterfiles lt list files C data envi full names TRUE d1 lt overlay stack rasterfiles fun function x
  • 编写健壮的 R 代码:命名空间、屏蔽和使用 `::` 运算符

    简洁版本 对于那些不想阅读我的 案例 的人来说 这就是本质 最小化新包破坏现有代码 即编写您编写的代码 的机会的推荐方法是什么尽可能坚固 充分利用该功能的推荐方法是什么 命名空间机制 when a just using贡献的软件包 比如在一
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f
  • 将天气 iframe 嵌入到 Shiny Dashboard 中

    我正在尝试将 Forecast io 的天气预报嵌入到闪亮的仪表板中 我最初在使用 符号时遇到了麻烦 但看到一篇文章提供了如何使用特殊字符格式化 HTML 代码的示例 但是 当我运行该应用程序时 我看到一个简单的 未找到 即使我知道该链接有

随机推荐