【问题标题】:Filter by a column value in a 3D matrix in R按 R 中 3D 矩阵中的列值过滤
【发布时间】:2022-01-04 12:38:48
【问题描述】:

编辑:我已经包含了一个可重现的示例。

我正在尝试在我的一个矩阵中进行一些简单的操作。我的矩阵是包含捕获-重新捕获数据的 3D 数组。

是个人 从 1 到 7 的列是采样时间(年) 第8栏个人性别:1男2女

libray(abind)
CH <- array(c(1,0,1,1,1,1,0), dim = c(5,7,10))
sex <- c(1,1,2,2,1)
CH_with_sex <- abind(CH, array(sex, replace(dim(CH), 2, 1)), along = 2)

CH_with_sex

, , 1

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    1    1    0    0    1    1    1
[2,]    0    0    1    1    1    1    1    1
[3,]    1    1    1    1    0    0    1    2
[4,]    1    0    0    1    1    1    1    2
[5,]    1    1    1    1    1    0    0    1

, , 2

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    1    1    0    0    1    1    1
[2,]    0    0    1    1    1    1    1    1
[3,]    1    1    1    1    0    0    1    2
[4,]    1    0    0    1    1    1    1    2
[5,]    1    1    1    1    1    0    0    1
dim(CH_with_sex)
[1]  5  8 10

我的目标是将男性和女性从这个 3D 阵列中分离出来,并有 2 个不同的阵列:一个用于男性,另一个用于女性。我想通过过滤第 8 列来实现它,但我找不到这样做的方法。我最终会破坏或丢失矩阵结构。有什么建议吗?

我想要的男性输出是这样的:

, , 1

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    1    1    0    0    1    1    1
[2,]    0    0    1    1    1    1    1    1
[3,]    1    1    1    1    1    0    0    1

, , 2

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    1    1    0    0    1    1    1
[2,]    0    0    1    1    1    1    1    1
[3,]    1    1    1    1    1    0    0    1

这对于女性来说:

, , 1

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    1    1    1    0    0    1    2
[2,]    1    0    0    1    1    1    1    2


, , 2

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    1    1    1    0    0    1    2
[2,]    1    0    0    1    1    1    1    2

【问题讨论】:

  • 嗨!您能否使用dput 提供一个最小且可重复的数据集?
  • 请包含所需的输出。 “过滤”在这里是模棱两可的:如果代表 1 的男性比代表 2 多怎么办?你想得到什么形状?
  • 谢谢你们的cmets,我做了这两件事。希望它更清楚。

标签: r arrays matrix multidimensional-array


【解决方案1】:

这里,x 是您的三维数组 CH_with_sexl 是两个三维数组的列表,按性别划分 x

d <- dim(x)
f <- function(i) x[i, , , drop = FALSE]
l <- c(tapply(seq_len(d[1L]), x[, d[2L], 1L], f, simplify = FALSE))

dim(l[[1]])
## [1]  3  8 10
dim(l[[2]])
## [1]  2  8 10

【讨论】:

  • 没问题。您是encouraged,点击左上角的复选标记接受有用的答案。
猜你喜欢
  • 1970-01-01
  • 2013-10-02
  • 2018-11-02
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多