如何删除列中超过2个连续的NA?

时间:2017-03-08 09:54:38

标签: r datetime duplicates missing-data

我是R新手,在我的数据框架中我有col1("时间戳"),col2("值")。我必须在col2中删除超过2个连续NA的行。我的数据框看起来如下,

Timestamp  | values  
-----------|--------
2011-01-02 |  2  
2011-01-03 |  3  
2011-01-04 |  NA  
2011-01-05 |  1  
2011-01-06 |  NA  
2011-01-07 |  NA    
2011-01-08 |  8  
2011-01-09 |  6  
2011-01-10 |  NA  
2011-01-11 |  NA  
2011-01-12 |  NA  
2011-01-13 |  2  

我想根据第二列删除超过2个重复行。预期产出 -

Timestamp  | values  
-----------|--------
2011-01-02 |  2  
2011-01-03 |  3  
2011-01-04 |  NA  
2011-01-05 |  1  
2011-01-06 |  NA  
2011-01-07 |  NA    
2011-01-08 |  8  
2011-01-09 |  6 
2011-01-13 |  2  

我提前感谢您寻找解决方案。

3 个答案:

答案 0 :(得分:7)

您可以使用行程编码函数rle。我假设数据已按日期排序。

r <- rle(is.na(df$values))                      # check runs of NA in value column
df[!rep(r$values & r$lengths > 2, r$lengths),]  # remove runs of >2 length

答案 1 :(得分:1)

以下是使用rleid中的data.table的另一个选项。将'data.frame'转换为'data.table'(setDT(df1)),按'值'的run-length-id分组,我们得到行索引(.I)所在的行数行大于2(.N >2)和(&all'值'为'NA'。提取索引($V1)以对原始数据集的行进行子集化。

library(data.table)
setDT(df1)[df1[, .I[!(.N >2 & all(is.na(values)))], rleid(is.na(values))]$V1]
#    Timestamp values
#1: 2011-01-02      2
#2: 2011-01-03      3
#3: 2011-01-04     NA
#4: 2011-01-05      1
#5: 2011-01-06     NA
#6: 2011-01-07     NA
#7: 2011-01-08      8
#8: 2011-01-09      6
#9: 2011-01-13      2

答案 2 :(得分:0)

你可以使用这一个班轮代码:

Df[!duplicated(Df$column),]