gpt4 book ai didi

右对齐 4d 数组中的 NA 值

转载 作者:行者123 更新时间:2023-12-05 02:26:55 26 4
gpt4 key购买 nike

上下文:我正在处理组织为具有以下结构的 4D 数组的调查数据:m[n_sites, n_surveys, n_years, n_species]

问题:虽然有数据随机丢失,但我想将丢失的数据移动到每一行的末尾。

示例:这是原始数据:

, , 1, 1

1 2 3 4 5
1 NA 2 NA 2 3
2 NA 3 1 NA NA
3 4 NA NA 4 6
4 2 NA NA 2 1

...我想将其重新排列为:

, , 1, 1

1 2 3 4 5
1 2 2 3 NA NA
2 3 1 NA NA NA
3 4 4 6 NA NA
4 2 2 1 NA NA

注意:虽然数据非常大,所以我需要一些高效且相当简单的东西。

可重现代码:

library(magrittr)  ## for %>% pipe
library(reshape2) ## for acast
set.seed(1)

# Simulate survey data
df <- expand.grid(
species = c(1,2),
year = c(1,2,3),
site = c(1,2,3,4),
survey = c(1,2,3,4,5))
df$counts <- rpois(n = nrow(df), lambda = 3)

# Add random NAs (missing data)
posNA <- sample(x = 1:nrow(df), size = 0.5 * nrow(df), replace = FALSE)
df$counts[posNA] <- NA

# Cast to 4d array
m <- df %>% acast(site ~ survey ~ year ~ species)

最佳答案

您可以在行以及第 3 和第 4 维上使用 na.omit,根据列的数量更正 length 并使用 aperm 转置结果>.

## 4D-array
apply(m, c(1, 3, 4), \(x) `length<-`(na.omit(x), dim(m)[2])) |> aperm(c(2, 1, 3, 4))
# , , 1, 1
#
# [,1] [,2] [,3] [,4] [,5]
# 1 2 2 3 NA NA
# 2 3 1 NA NA NA
# 3 4 4 6 NA NA
# 4 2 2 1 NA NA
#
# , , 2, 1
#
# [,1] [,2] [,3] [,4] [,5]
# 1 3 0 3 NA NA
# 2 3 3 2 3 NA
# 3 3 4 NA NA NA
# 4 6 3 1 NA NA
#
# , , 3, 1
#
# [,1] [,2] [,3] [,4] [,5]
# 1 2 NA NA NA NA
# 2 2 1 NA NA NA
# 3 4 2 NA NA NA
# 4 4 0 4 3 NA
#
# , , 1, 2
#
# [,1] [,2] [,3] [,4] [,5]
# 1 2 2 NA NA NA
# 2 4 3 8 NA NA
# 3 2 1 2 3 NA
# 4 4 NA NA NA NA
#
# , , 2, 2
#
# [,1] [,2] [,3] [,4] [,5]
# 1 5 5 NA NA NA
# 2 4 NA NA NA NA
# 3 2 1 NA NA NA
# 4 5 NA NA NA NA
#
# , , 3, 2
#
# [,1] [,2] [,3] [,4] [,5]
# 1 5 2 2 2 NA
# 2 1 4 2 3 NA
# 3 8 2 3 NA NA
# 4 5 NA NA NA NA

这里还有一个更简单的数组来演示逻辑:

## 3D-array
a
# , , 1
#
# [,1] [,2] [,3] [,4]
# [1,] NA NA 1 3
# [2,] 4 1 1 NA
# [3,] NA 3 NA 4
#
# , , 2
#
# [,1] [,2] [,3] [,4]
# [1,] 3 2 2 4
# [2,] 1 NA 3 4
# [3,] 1 NA 4 3

apply(a, c(1, 3), \(x) `length<-`(na.omit(x), dim(a)[2])) |> aperm(c(2, 1, 3))
# , , 1
#
# [,1] [,2] [,3] [,4]
# [1,] 1 3 NA NA
# [2,] 4 1 1 NA
# [3,] 3 4 NA NA
#
# , , 2
#
# [,1] [,2] [,3] [,4]
# [1,] 3 2 2 4
# [2,] 1 3 4 NA
# [3,] 1 4 3 NA

数据:

m <- structure(c(NA, NA, 4L, 2L, 2L, 3L, NA, NA, NA, 1L, NA, NA, 2L, 
NA, 4L, 2L, 3L, NA, 6L, 1L, 3L, 3L, NA, 6L, 0L, 3L, NA, 3L, NA,
2L, 3L, 1L, 3L, 3L, 4L, NA, NA, NA, NA, NA, 2L, 2L, 4L, 4L, NA,
NA, NA, 0L, NA, NA, NA, NA, NA, NA, NA, 4L, NA, 1L, 2L, 3L, NA,
4L, 2L, NA, NA, 3L, 1L, NA, NA, NA, 2L, 4L, 2L, NA, NA, NA, 2L,
8L, 3L, NA, 5L, NA, NA, NA, NA, NA, NA, NA, 5L, NA, 2L, NA, NA,
4L, 1L, 5L, NA, NA, NA, NA, 5L, 1L, 8L, NA, 2L, 4L, NA, NA, 2L,
NA, 2L, 5L, NA, 2L, NA, NA, 2L, 3L, 3L, NA), dim = c(4L, 5L,
3L, 2L), dimnames = list(c("1", "2", "3", "4"), c("1", "2", "3",
"4", "5"), c("1", "2", "3"), c("1", "2")))


a <- structure(c(NA, 4L, NA, NA, 1L, 3L, 1L, 1L, NA, 3L, NA, 4L, 3L,
1L, 1L, 2L, NA, NA, 2L, 3L, 4L, 4L, 4L, 3L), dim = c(3L, 4L,
2L))

关于右对齐 4d 数组中的 NA 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73547167/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com