簡體   English   中英

如果最近n次觀察中沒有任何NA,如何選擇列? 如果相鄰NA的觀測值多於x,如何刪除列?

[英]How to select columns if there is not any NA in the last n observations? How to drop columns if there are more than x adjacent NA's observations?

我需要以下內容:

1)在以下情況下保留列:i)最后n個觀測值(n = 3)不是NA,ii)根本沒有NA,iii)從最后一個NA向后倒數,相鄰的NA觀測值不超過3

2)如果出現以下情況,請刪除列:i)有3個或更多相鄰的NA觀測值

我想如果答案是使用dplyr

一些例子:

data = data.frame(
  A = c(3,3,3,3,4, rep(NA,5)),
  B = c(rnorm(10)),
  C = c(rep(NA,3), rnorm(7)),
  D = c(rnorm(8), NA, NA)
)

我試過了:

data %>% 
  select_if(~sum(!is.na(.)) >= 3)
  select_if(~sum(is.na(.)) > 0)

在我的示例中,我只保留B,C和D。

我們可以使用tail獲取最后n個條目,並刪除all均為NA的列。

n <- 3
library(dplyr)

data %>% select_if(~!all(is.na(tail(., n))))

#         B      C        D
#1   0.5697     NA  0.29145
#2  -0.1351     NA -0.44329
#3   2.4016     NA  0.00111
#4  -0.0392  0.153  0.07434
#5   0.6897  2.173 -0.58952
#6   0.0280  0.476 -0.56867
#7  -0.7433 -0.710 -0.13518
#8   0.1888  0.611  1.17809
#9  -1.8050 -0.934       NA
#10  1.4656 -1.254       NA

或采用反邏輯

data %>% select_if(~any(!is.na(tail(., n))))

對於第二個條件,

如果出現以下情況,請刪除列:i)有3個或更多相鄰的NA觀測值

我們可以使用rle獲取相鄰值

data %>% select_if(~!any(with(rle(is.na(.)), lengths[values]) >= n))

#         B        D
#1   0.5697  0.29145
#2  -0.1351 -0.44329
#3   2.4016  0.00111
#4  -0.0392  0.07434
#5   0.6897 -0.58952
#6   0.0280 -0.56867
#7  -0.7433 -0.13518
#8   0.1888  1.17809
#9  -1.8050       NA
#10  1.4656       NA

由於我們已經有了這些功能,因此我們可以在base R和sapply使用相同的功能

#Condition 1
data[!sapply(data, function(x) all(is.na(tail(x, n))))]

#Condition 2
data[!sapply(data, function(x) any(with(rle(is.na(x)), lengths[values]) >= n))]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM