什么是检查R中丢失数据模式的最优雅的方法?

问题描述 投票:0回答:3

我在R中有一组长度为16的数字矢量,我想选择所有值都出现在四个位置之一的那些矢量:1:4、5:8、9:12、13:16

例如向量c(NA, 1, NA, 1, 1, 1, 1, 1, NA, NA, 1, NA, NA, 1, NA, 1, NA)将通过测试,因为位置5:8均为非NA。

哪种方法最优雅(即使用最少的易读代码)进行测试?

r na
3个回答
5
投票

有了索引列表,您可以遍历那些范围并寻找没有任何NA的那些:

vec <- c(NA, 1, NA, 1, 1, 1, 1, 1, NA, NA, 1, NA, NA, 1, NA, 1, NA)
sapply(list(1:4, 5:8, 9:12, 13:16),
       function(ind) !anyNA(vec[ind]))
# [1] FALSE  TRUE FALSE FALSE

如果要返回这些索引内的值:

inds <- list(1:4, 5:8, 9:12, 13:16)
good <- sapply(inds, function(ind) !anyNA(vec[ind]))
# should check that `any(good)` is true
inds[[ which(good)[1] ]]
# [1] 5 6 7 8
vec[ inds[[ which(good)[1] ]] ]
# [1] 1 1 1 1

2
投票

[这是rleid的选项,用于获取向量的游程长度编码ID,将其用作分组变量,以检查序列中是否有完整的非NA元素集

library(data.table)
any(as.logical(ave(seq_along(v1) * v1, rleid(v1),
         FUN = function(x) all(!is.na(x))) ))
#[1] TRUE

或者也可能是>

any(with(rle(!is.na(v1)), lengths[values] >=4))
#[1] TRUE

或者另一个选项是table

4 %in% table(v1 * (seq_along(v1) -1) %/% 4)
#[1] TRUE

数据

v1 <- c(NA, 1, NA, 1, 1, 1, 1, 1, NA, NA, 1, NA, NA, 1, NA, 1, NA)

1
投票

以下代码将返回单个值(TRUEFALSE)。如果向量通过测试,则返回TRUE

© www.soinside.com 2019 - 2024. All rights reserved.